Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Apache spark 无缝覆盖impala表的底层拼花地板数据_Apache Spark_Parquet_Impala - Fatal编程技术网

Apache spark 无缝覆盖impala表的底层拼花地板数据

Apache spark 无缝覆盖impala表的底层拼花地板数据,apache-spark,parquet,impala,Apache Spark,Parquet,Impala,我有一张黑斑羚桌子,后面有拼花文件,这是另一支球队使用的。 每天我都会运行一个批处理Spark作业,覆盖现有的拼花地板文件(创建新的数据集,现有文件将被删除,新文件将被创建) 我们的Spark代码如下所示 dataset.write.format(“拼花”).mode(“覆盖”).save(路径) 在此更新过程中(覆盖拼花地板数据文件,然后刷新Impala表),如果有人访问该表,那么他们最终会错误地说底层数据文件不存在 是否有解决此问题的解决方案或解决方法?因为我不希望其他团队在访问表时在任何时

我有一张黑斑羚桌子,后面有拼花文件,这是另一支球队使用的。 每天我都会运行一个批处理Spark作业,覆盖现有的拼花地板文件(创建新的数据集,现有文件将被删除,新文件将被创建)

我们的Spark代码如下所示

dataset.write.format(“拼花”).mode(“覆盖”).save(路径)

在此更新过程中(覆盖拼花地板数据文件,然后刷新Impala表),如果有人访问该表,那么他们最终会错误地说底层数据文件不存在

是否有解决此问题的解决方案或解决方法?因为我不希望其他团队在访问表时在任何时间点看到错误


也许我可以将新的数据文件写入不同的位置,然后使Impala表指向该位置?

您看到的行为是因为Impala的工作方式。Impala从HMS获取表的元数据,如表结构、分区详细信息、HDFS文件路径,并从NameNode获取相应HDFS文件路径的块详细信息。所有这些详细信息都由目录获取,并将分发到Impala守护进程中以供执行

当删除表的底层文件并在Impala外部写入新文件时,需要执行刷新,以便获取新文件详细信息(例如文件和相应的块详细信息)并在守护进程中分发。这样,黑斑羚就会意识到新编写的文件

由于您正在覆盖文件,Impala查询将无法找到它所知道的文件,因为它们已经被删除,并且正在写入新文件。这是意料之中的事

作为解决方案,您可以执行以下操作之一:

  • 将新文件追加到表的同一HDFS路径中,而不是覆盖。这样,在表上运行的Impala查询仍将返回结果。但是,结果只会是较旧的数据(因为Impala还不知道新文件),但您所说的错误将在覆盖发生期间避免。在表的目录中创建新文件后,可以执行HDFS操作删除文件,然后执行此表的Impala REFRESH语句

  • 正如您所说,您可以在不同的HDFS路径中写入新拼花地板文件,一旦写入完成,您可以[删除旧文件,将新文件移动到表的实际HDFS路径中,然后刷新][对该表发出ALTER语句以修改指向新目录的表数据的位置]。如果这是一个日常进程,您可能必须通过一个脚本来实现这一点,该脚本在Spark成功完成写入进程后运行,将目录(新目录和旧目录)作为参数传递

  • 希望这有帮助!

    您能解释一下“覆盖拼花数据文件”的更多信息吗?您是否先删除拼花文件,然后使用Spark在同一目录下写入新的拼花数据文件?@Gomz谢谢,编辑了我的问题并添加了更多信息。“它们最终会出错…”--能否添加运行查询时遇到的确切错误?