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つのテーブルのスキーマのすべての側面は、まったく同じようだ
。