2016-08-20 1 views
2

Ich habe eine externe partitionierte Hive-Tabelle mit der zugrunde liegenden Datei ROW FORMAT DELIMITED FIELDS TERMINATED VON '|' Das direkte Lesen von Daten über Hive ist in Ordnung, aber wenn Sie die Dataframe-API von Spark verwenden, wird das Trennzeichen '|' wird nicht berücksichtigt.Spark HiveContext - Lesen von extern partitionierten Hive-Tabelle Delimiter Problem

erstellen externe partitionierten Tabelle:

hive> create external table external_delimited_table(value1 string, value2 string) 
partitioned by (year string, month string, day string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' 
location '/client/edb/poc_database/external_delimited_table'; 

erstellen Datendatei nur eine Zeile containg und legen Sie sie auf externe partitionierten Tabelle Ort:

shell>echo "one|two" >> table_data.csv 
shell>hadoop fs -mkdir -p /client/edb/poc_database/external_delimited_table/year=2016/month=08/day=20 
shell>hadoop fs -copyFromLocal table_data.csv /client/edb/poc_database/external_delimited_table/year=2016/month=08/day=20 

Make-Partition aktiv:

hive> alter table external_delimited_table add partition (year='2016',month='08',day='20'); 

Gesundheitscheck:

hive> select * from external_delimited_table; 
select * from external_delimited_table; 
+----------------------------------+----------------------------------+--------------------------------+---------------------------------+-------------------------------+--+ 
| external_delimited_table.value1 | external_delimited_table.value2 | external_delimited_table.year | external_delimited_table.month | external_delimited_table.day | 
+----------------------------------+----------------------------------+--------------------------------+---------------------------------+-------------------------------+--+ 
| one        | two        | 2016       | 08        | 20 

Spark-Code:

import org.apache.spark.sql.DataFrame 
import org.apache.spark.sql.hive.HiveContext 
import org.apache.spark.{SparkContext, SparkConf} 
object TestHiveContext { 

    def main(args: Array[String]): Unit = { 

    val conf = new SparkConf().setAppName("Test Hive Context") 

    val spark = new SparkContext(conf) 
    val hiveContext = new HiveContext(spark) 

    val dataFrame: DataFrame = hiveContext.sql("SELECT * FROM external_delimited_table") 
    dataFrame.show() 

    spark.stop() 
    } 

dataFrame.show() -Ausgabe:

+-------+------+----+-----+---+ 
| value1|value2|year|month|day| 
+-------+------+----+-----+---+ 
|one|two| null|2016| 08| 20| 
+-------+------+----+-----+---+ 

Antwort

2

Dies erwies sich als ein Problem mit Spark-Version 1.5.0 sein. In Version 1.6.0 findet kein Problem statt:

scala> sqlContext.sql("select * from external_delimited_table") 
res2: org.apache.spark.sql.DataFrame = [value1: string, value2: string, year: string, month: string, day: string] 

scala> res2.show 
+------+------+----+-----+---+ 
|value1|value2|year|month|day| 
+------+------+----+-----+---+ 
| one| two|2016| 08| 20| 
+------+------+----+-----+---+ 
Verwandte Themen