2016-08-20 10 views
2

下位ファイルのある外部パーティションのハイブテーブルがあります。ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' Hive経由で直接データを読み込むのは問題ありませんが、SparkのDataframe APIを使用する場合、区切り文字 '|'考慮されていません。Spark HiveContext - 外部パーティションのハイブテーブルの区切り文字からの読み込み

外部パーティション表を作成します。

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'; 

は1行のみをcontaingデータファイルを作成し、外部のパーティションテーブルの場所にそれを置く:

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 

は、パーティションをアクティブにする:

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

正常性チェック:

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 

スパークコード:

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()出力:

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

答えて

2

これは、Sparkバージョン1.5.0に問題があることが判明しました。バージョン1.6.0で問題が発生しない:

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| 
+------+------+----+-----+---+ 
関連する問題