我无法弄清楚如何使用Spark SQL将数据插入到Hive表的静态分区中。我可以使用这样的代码写入动态分区:
df.write.partitionBy("key").insertInto("my_table")
但是,我无法弄清楚如何将数据插入静态分区。这意味着,我想定义应该写入整个DataFrame的分区,而无需将列添加到DataFrame。
我看到了提到的静态分区 InsertIntoHiveTable类,所以我猜它是受支持的。是否有公共API可以满足我的需求?
答案 0 :(得分:1)
您可以使用
DataFrame tableMeta = sqlContext.sql(String.format("DESCRIBE FORMATTED %s", tableName));
String location = tableMeta.filter("result LIKE 'Location:%'").first().getString(0);
并使用正则表达式来获取表分区。获得表位置后,您可以轻松构建分区位置,如
String partitionLocation = location + "/" + partitionKey
(partitionKey类似于dt = 20160329 / hr = 21)
然后,您可以写入该路径
df.write.parquet(partitionLocation)
(在我的情况下,当我构建数据帧时,我不包括分区列。不确定包含分区列时是否有任何错误)