使用我们有大约十亿条记录的Spark在一个或多个表上执行更新

时间:2018-07-17 14:28:04

标签: scala apache-spark dataframe apache-spark-sql rdd

我需要使用Spark执行更新,因为我们有大约十亿条记录。

我们目前正在尝试将更新功能纳入使用Spark和Scala的工具中。

我已经完成研究,即使是最新版本也不允许在Spark中进行更新。


  • 但是HIVE确实通过启用ACID允许执行更新 属性。

我提出了一种解决方案,对需要在每一行中进行更新的值使用CASE语句。

在下面给出了说明:

源查询:

UPDATE A FROM  APRUPD_EMP A,APRUPD_EMP_DTL B  SET EMP_BON = 1234, EMP_STATUS='T' WHERE A.EMP_ID=B.EMP_ID

SPARK-SQL

val df2=sql("""SELECT A.EMP_ID,A.EMP_NAME,A.EMP_DOB,A.EMP_TOB,A.EMP_YOE,A.EMP_SAL,A.EMP_JNDT,case when A.EMP_ID=B.EMP_ID then 1234 else a.emp_bon end AS EMP_BON,A.EMP_AGE,case when A.EMP_ID=B.EMP_ID then 'T' else a.emp_status end AS EMP_STATUS FROM APRUPD_EMP A JOIN APRUPD_EMP_DTL B ON A.EMP_ID=B.EMP_ID""")

df2.write.mode(SaveMode.Overwrite).insertInto("APRUPD_EMP")                      

上述建议将适用于数千/几百万条记录,但对于十亿条记录,尚不确定是否可行,并担心使群集崩溃。

还有另一个问题,上述方法是否会将所有记录都带入内存以进行处理,并且会导致更大的内存问题?

等待专家建议。

0 个答案:

没有答案