2016-07-29 1044 views
4

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

df.write.partitionBy("key").insertInto("my_table") 

但是,我想不出如何将数据插入到静态分区。这意味着,我想定义整个DataFrame应该被写入的分区,而不需要将列添加到DataFrame。

我看到在 InsertIntoHiveTable类中提到的静态分区,所以我想它是支持的。有没有公​​共的API来做我想要的?

+0

是你能够找到类似于任何API写入动态分区? – Explorer

+1

不,我无法找到任何东西,最终将RRD注册为临时表并从中运行SQL INSERT。但是很多Hive代码已经在Spark 2.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 /小时= 21)

然后,你可以写信给这条道路

df.write.parquet(partitionLocation) 

(对我来说,当我建立数据框,我不包括分区列。不是知道是否有当包含分区列的任何错误)

+1

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

+0

同意运行HiveSQL来插入数据。我也在寻找对此的本地支持,但无法在任何地方找到它。 – tpham