Ошибка Spark SQL insertInto() для ключа раздела

Я пытаюсь загрузить данные из S3, преобразовать их, а затем вставить в таблицу кустов с разделом.

Сначала я начал с создания_даты (bigint) в качестве ключа раздела, и он работал хорошо, однако теперь, когда я пытаюсь вставить те же данные с ключом раздела создания_месяца, это не удается.

Вот код

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")

Схема первой таблицы

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

Схема 2-го стола

[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")

Однако вставка во вторую таблицу дает ошибку.

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

first(sourceMap['video_url']) as video_url, trunc(from_unixtime(first(sourceMap['creation_date']) / 1000), 'MONTH') as created_month из группы сообщений по externalId")

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

Ошибка:

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

Я не уверен, что изменится, когда мы добавим еще одно поле создания_месяца. Каждый аспект схемы для двух таблиц кажется совершенно одинаковым.


person lazywiz    schedule 23.03.2016    source источник


Ответы (1)


У меня проблема. Это было в упорядочении столбцов.

Полевой порядок был

external_id, tag, video_url, creation_date

Но в запросе выбора у меня было это

external_id, creation_date, tag, video_url

Следовательно, Hive пытался преобразовать дату создания в виде массива.

person lazywiz    schedule 23.03.2016