写入动态分区Java Spark
我已在配置单元中创建了下表:写入动态分区Java Spark,java,apache-spark,hive,Java,Apache Spark,Hive,我已在配置单元中创建了下表: CREATE TABLE mytable (..columns...) PARTITIONED BY (load_date string) STORED AS ... 我正尝试使用spark将数据插入到我的表中,如下所示: Dataset<Row> dfSelect = df.withColumn("load_date","15_07_2018"); dfSelect.write().mode("append").partitionBy("load_d
CREATE TABLE mytable (..columns...) PARTITIONED BY (load_date string) STORED AS ...
我正尝试使用spark将数据插入到我的表中,如下所示:
Dataset<Row> dfSelect = df.withColumn("load_date","15_07_2018");
dfSelect.write().mode("append").partitionBy("load_date").save(path);
在我执行write命令后,我在HDFS上看到目录/myDbPath/load\u date=15\u 07\u 2018
,其中包含我编写的文件,但当我进行如下查询时:
show partitions mytable
或
我有0张唱片
发生了什么事,我该如何解决
编辑
如果在色调中运行以下命令:
msck repair table mytable
我解决了这个问题,如何在我的代码中做到这一点?Hive将每个表的分区列表存储在其元存储中。但是,如果新分区直接添加到HDFS(例如通过使用hadoop fs-put命令(或.save..等),除非用户运行以下命令之一,否则元存储(以及配置单元)将不会知道这些分区
msck修复表代码>
(或)
ALTER TABLE_name在每个新添加的分区上添加分区命令
我们还可以使用ALTERTABLE语句来添加分区。通过这种方式,我们需要将每个新创建的分区添加到表中
altertable。添加分区(load_date=“15_07_2018”)位置;
运行上述任一语句,然后再次检查load_date=“15_07_2018”的数据
有关更多详细信息,请参阅这些链接,此链接可能会为您提供有关使用java添加分区的一些见解谢谢,我可以从SparkSQL执行吗?是的,初始化并使用配置单元上下文,然后执行msck修复表hiveContext.sql(“msck修复表”)。。如果您使用的是Spark 2.0+,那么Spark.sql(“msck repair table”)可以,但每次执行save命令时我都需要这样做吗?它不应该造成性能问题吗?如果您直接将数据写入HDFS位置,那么每次都需要执行msck修复表stmt以将新创建的分区添加到配置单元表中,我认为没有任何性能问题。另一种方法是使用spark在配置单元表中创建动态分区,请参阅此链接。。如果我们这样创建分区,您就不必再次运行msck修复表。
select * from mytable where load_date="15_07_2018"
msck repair table mytable
alter table <db.name>.<table_name> add partition(load_date="15_07_2018") location <hdfs-location>;