指定分区时,spark sql saveastable与配置单元不兼容

vsikbqxv  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(636)

类似于边的情况,在使用分区保存spark sql中的parquet表时,

  1. # schema definitioin
  2. final StructType schema = DataTypes.createStructType(Arrays.asList(
  3. DataTypes.createStructField("time", DataTypes.StringType, true),
  4. DataTypes.createStructField("accountId", DataTypes.StringType, true),
  5. ...
  6. DataFrame df = hiveContext.read().schema(schema).json(stringJavaRDD);
  7. df.coalesce(1)
  8. .write()
  9. .mode(SaveMode.Append)
  10. .format("parquet")
  11. .partitionBy("year")
  12. .saveAsTable("tblclick8partitioned");

Spark警告:
以特定于spark sql的格式将分区数据源关系持久化到配置单元元存储中,这与配置单元不兼容
在Hive中:

  1. hive> describe tblclick8partitioned;
  2. OK
  3. col array<string> from deserializer
  4. Time taken: 0.04 seconds, Fetched: 1 row(s)

显然,模式是不正确的-但是如果我使用 saveAsTable 在没有分区的sparksql中,可以毫无问题地查询表。
问题是如何使sparksql中的parquet表与具有分区信息的hive兼容?

up9lanfz

up9lanfz1#

解决方案是使用配置单元创建表,然后使用 ...partitionBy("year").insertInto("default.mytable") .
根据我的经验,在配置单元中创建表,然后使用 ...partitionBy("year").saveAsTable("default.mytable") 不起作用。这是spark 1.6.2。

ny6fqffe

ny6fqffe2#

这是因为dataframe.saveastable创建的是rdd分区,而不是hive分区,解决方法是在调用dataframe.saveastable之前通过hql创建表。spark-14927的示例如下:

  1. hc.sql("create external table tmp.partitiontest1(val string) partitioned by (year int)")
  2. Seq(2012 -> "a", 2013 -> "b", 2014 -> "c").toDF("year", "val")
  3. .write
  4. .partitionBy("year")
  5. .mode(SaveMode.Append)
  6. .saveAsTable("tmp.partitiontest1")

相关问题