Spark HiveContext:Insert覆盖从中读取的同一个表

时间:2017-09-10 16:43:08

标签: apache-spark hive pyspark hivecontext

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

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

是否有任何属性或方法来存储最终数据集而不保持对从中读取的表的依赖性。这样,就有可能覆盖该表。

请建议。

3 个答案:

答案 0 :(得分:2)

您永远不应该覆盖您正在阅读的表格。如果发生故障,它可能导致数据损坏和完全数据丢失之间的任何问题。

同样重要的是要指出,正确实现的SCD2不应该永远不会覆盖整个表,并且可以实现为(大部分)追加操作。据我所知,如果没有可变存储,SCD1无法有效实现,因此不适合Spark。

答案 1 :(得分:0)

当我在那里查看一处房产时,我正在阅读火花的文档和点击给我的想法。

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

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

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

答案 2 :(得分:-1)

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

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