在使用分区的Spark SQL中保存镶木桌时的一种边缘情况,
#schema definitioin
final StructType schema = DataTypes.createStructType(Arrays.asList(
DataTypes.createStructField("time", DataTypes.StringType, true),
DataTypes.createStructField("accountId", DataTypes.StringType, true),
...
DataFrame df = hiveContext.read().schema(schema).json(stringJavaRDD);
df.coalesce(1)
.write()
.mode(SaveMode.Append)
.format("parquet")
.partitionBy("year")
.saveAsTable("tblclick8partitioned");
Spark警告:
将分区数据源关系保存到Hive Metastore中 Spark SQL特定格式,与Hive不兼容
在Hive中:
hive> describe tblclick8partitioned;
OK
col array<string> from deserializer
Time taken: 0.04 seconds, Fetched: 1 row(s)
显然架构不正确 - 但是如果我在没有分区的情况下在Spark SQL中使用saveAsTable
,则可以毫无问题地查询表。
问题是如何在Spark SQL中使用分区信息与Hive兼容的镶木桌?
答案 0 :(得分:8)
那是因为DataFrame.saveAsTable创建了RDD分区而不是Hive分区,解决方法是在调用DataFrame.saveAsTable之前通过hql创建表。 SPARK-14927的示例如下所示:
hc.sql("create external table tmp.partitiontest1(val string) partitioned by (year int)")
Seq(2012 -> "a", 2013 -> "b", 2014 -> "c").toDF("year", "val")
.write
.partitionBy("year")
.mode(SaveMode.Append)
.saveAsTable("tmp.partitiontest1")
答案 1 :(得分:1)
解决方案是使用Hive创建表,然后使用...partitionBy("year").insertInto("default.mytable")
保存数据。
根据我的经验,在Hive中创建表然后使用...partitionBy("year").saveAsTable("default.mytable")
不起作用。这是Spark 1.6.2。