Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
写入动态分区Java Spark_Java_Apache Spark_Hive - Fatal编程技术网

写入动态分区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修复表)
  • 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>;