使用 Spark SQL 将数据插入静态 Hive 分区

Luk*_*ský 5 hive apache-spark

我无法弄清楚如何使用 Spark SQL 将数据插入到 Hive 表的静态分区中。我可以使用这样的代码写入动态分区:

df.write.partitionBy("key").insertInto("my_table")
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何将数据插入到静态分区中。这意味着,我想定义应该写入整个 DataFrame 的分区,而无需将列添加到 DataFrame。

我在InsertIntoHiveTable类中看到了静态分区 ,所以我想它是受支持的。是否有公共 API 来做我想做的事?

小智 1

您可以使用

DataFrame tableMeta = sqlContext.sql(String.format("DESCRIBE FORMATTED %s", tableName));
String location = tableMeta.filter("result LIKE 'Location:%'").first().getString(0);
Run Code Online (Sandbox Code Playgroud)

并使用正则表达式来获取表分区。一旦获得表位置,您就可以轻松构建分区位置,例如

String partitionLocation = location + "/" + partitionKey
Run Code Online (Sandbox Code Playgroud)

(partitionKey 类似于 dt=20160329/hr=21)

然后,您可以写入该路径

df.write.parquet(partitionLocation)
Run Code Online (Sandbox Code Playgroud)

(就我而言,当我构建数据框时,我不包含分区列。不确定包含分区列时是否存在任何错误)

  • 我认为将 DataFrame 注册为临时表,然后运行 ​​Hive SQL 将数据从那里插入到特定分区是比这更好的解决方案(它不那么脆弱),但我特别想知道 Spark 中对此的本机支持。 (2认同)