2016-03-23 3 views
1

S3からデータをロードしようとしましたが、それを変換してパーティション付きのハイブテーブルに挿入しようとしています。Spark SQL insertInto()がパーティションキーで失敗しました

私はパーティションキーとしてcreation_date(bigint)を使い始めましたが、うまくいきましたが、creation_monthパーティションキーで同じデータを挿入しようとすると、失敗しています。ここ

コード

var hiveCtx = new org.apache.spark.sql.hive.HiveContext(sc) 
var df = hiveCtx.read.json("s3n://spark-feedstore/2016/1/*") 
import org.apache.spark.storage.StorageLevel 
import org.apache.spark.sql.SaveMode 
hiveCtx.sql("SET hive.exec.dynamic.partition = true") 
hiveCtx.sql("SET hive.exec.dynamic.partition.mode = nonstrict") 

df.persist(StorageLevel.MEMORY_AND_DISK) 
df.registerTempTable("posts") 

最初のテーブルのスキーマ第2テーブルの

[external_id,string,] 
[tags,array<string>,] 
[creation_date,bigint,] 
[video_url,string,] 
# Partition Information  
creation_date bigint 

スキーマ

[external_id,string,] 
[tags,array<string>,] 
[creation_date,bigint,] 
[video_url,string,] 
[creation_month,date,] 
# Partition Information  
creation_month bigint 

使用して最初のテーブルに挿入微細進みます。

var udf = hiveCtx .sql("select externalId as external_id, first(sourceMap['tags']) as tags, first(sourceMap['creation_date']) as creation_date, 
first(sourceMap['video_url']) as video_url 
from posts group by externalId") 

udf.write.mode(SaveMode.Append).partitionBy("creation_date").insertInto("posts_1") 

ただし、2番目の表に挿入するとエラーになります。

var udf = hiveCtx .sql("select externalId as external_id, first(sourceMap['brand_hashtags']) as brand_hashtags, first(sourceMap['creation_date']) as creation_date, 

外部IDによってポスト群からcreation_month」としてvideo_url、TRUNC(FROM_UNIXTIME(最初(sourceMap [ 'CREATION_DATE'])/ 1000)、 'MONTH')として(sourceMap [ 'video_url'])第一)

udf.write.mode(SaveMode.Append).partitionBy("creation_month").insertInto("posts_2") 

エラー:。私たちは、別のフィールドcreation_monthを追加したときに変更内容を確認していない

org.apache.spark.sql.AnalysisException: cannot resolve 'cast(creation_date as array<string>)' due to data type mismatch: cannot cast LongType to ArrayType(StringType,true); 

2つのテーブルのスキーマのすべての側面は、まったく同じようだ

答えて

3

問題が発生しました。 それは列の順序にあった。

フィールドオーダー

external_id, tag, video_url, creation_date 

だったが、選択クエリで私はそれが

external_id, creation_date, tag, video_url 

したがってハイブが配列

としてCREATION_DATEをキャストしようとしていたました
関連する問題