繁体   English   中英

Spark HiveContext:插入覆盖从中读取的同一表

[英]Spark HiveContext : Insert Overwrite the same table it is read from

我想在HiveContext中使用PySpark来应用SCD1和SCD2。 在我的方法中,我正在读取增量数据和目标表。 阅读后,我将加入他们的进阶方法。 我正在对所有源数据帧执行registerTempTable。 我正在尝试将最终数据集写入目标表,并且面临一个问题,即从读取表中无法进行插入覆盖。

请为此提出一些解决方案。 我不想将中间数据写入物理表并再次读取。

是否有任何属性或方法可以存储最终数据集,而又不保留对其读取表的依赖性。 这样,可能会覆盖表。

请提出建议。

您永远不应覆盖正在读取的表。 在发生故障的情况下,这可能会导致数据损坏到数据完全丢失。

同样重要的是要指出,正确实现的SCD2永远都不应覆盖整个表,而可以将其实现为(主要是)附加操作。 据我所知,没有可变存储就无法有效地实现SCD1,因此它不太适合Spark。

当我检查Spark的文档时,当我检查那里的一个物业时,一个念头响了起来。

由于我的桌子是镶木地板,因此我使用蜂巢元存储通过将此属性设置为false来读取数据。

hiveContext.conf("spark.sql.hive.convertMetastoreParquet","false")

这个解决方案对我来说很好。

DataFrame不允许插入覆盖到相同的位置或相同的表,您可以使用下面的选项来解决您的问题。

  1. 在spark / hivecontext上运行Hive插入覆盖查询,但是如果作业失败数据失败,则会在该分区上损坏该问题,因此请务必小心。
  2. 作业完成后,其他选项保存到Temp表中,覆盖到目标表中。
  3. 如果仍要以编程方式使用,则可以将数据帧保存在tmp位置,并使用HDFS I / O移至目标分区位置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM