我需要使用Spark执行更新,因为我们有大约十亿条记录。
我们目前正在尝试将更新功能纳入使用Spark和Scala的工具中。
我已经完成研究,即使是最新版本也不允许在Spark中进行更新。
我提出了一种解决方案,对需要在每一行中进行更新的值使用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")
上述建议将适用于数千/几百万条记录,但对于十亿条记录,尚不确定是否可行,并担心使群集崩溃。
还有另一个问题,上述方法是否会将所有记录都带入内存以进行处理,并且会导致更大的内存问题?
等待专家建议。