当指定分区时,Spark SQL saveAsTable与Hive不兼容



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

火花警告说:

将分区的数据源关系持久化到Hive metastore中Spark SQL特定格式,与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兼容的拼花表?

这是因为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")

一个解决方案是用Hive创建表,然后用...partitionBy("year").insertInto("default.mytable")保存数据。

根据我的经验,在Hive中创建表,然后使用...partitionBy("year").saveAsTable("default.mytable")不起作用。

相关内容

  • 没有找到相关文章

最新更新