【发布时间】:2017-08-15 00:00:31
【问题描述】:
我在从 Spark 写入 Hive 表时遇到问题。下面的代码工作得很好;我可以编写表格(默认为 Parquet 格式)并在 Hive 中读回:
df.write.mode('overwrite').saveAsTable("db.table")
hive> describe table;
OK
val string
Time taken: 0.021 seconds, Fetched: 1 row(s)
但是,如果我指定格式应该是 csv:
df.write.mode('overwrite').format('csv').saveAsTable("db.table")
然后我可以保存表,但 Hive 无法识别架构:
hive> describe table;
OK
col array<string> from deserializer
Time taken: 0.02 seconds, Fetched: 1 row(s)
另外值得注意的是,我可以手动创建一个Hive表,然后insertInto它:
spark.sql("create table db.table(val string)")
df.select('val').write.mode("overwrite").insertInto("db.table")
这样做,Hive 似乎可以识别架构。但这很笨拙,而且我无论如何也想不出一种自动化模式字符串的方法。
【问题讨论】:
-
Dataframe 的架构是什么?数据中有逗号吗?
-
df.printSchema的输出是什么?
-
为什么是“笨重”?您想要创建一个符合 Hive 的数据集,因此使用符合 Hive 的方法来创建它似乎是合理的。为了记录,Parquet 更糟糕,因为默认情况下 Spark 不使用与 Hive 相同的二进制编码......并且没有记录覆盖该默认值的方法 cf。 [SPARK-20937]
-
@cricket_007 和 Ankush Singh:架构和数据很简单,我尝试过各种方法。即使是具有单个整数列的 DataFrame 也无法写入 Hive 可以读取的模式(使用 csv 格式)。
-
@samsonScharfrichter 我说“笨拙”是因为您必须编写一个符合 hive 的模式字符串。当使用默认格式的
saveAsTable时,您不必这样做。我没有遇到 Parquet 的二进制编码问题。感谢您的提醒!
标签: apache-spark hive pyspark apache-spark-sql