我们正在使用Spark处理大数据,并且最近有了新的用例,我们需要使用spark更新Hive表中的数据。
下面是一个简单的示例: 数据驻留在Hive表中,应用程序使用PySpark读入数据帧(例如df1)。 例如:数据框在下面的列中。
EmpNo名称年龄工资
1 aaaa 28 30000
2 bbbb 38 20000
3 cccc 26 25000
4 dddd 30 32000
需要使用spark将更多记录添加到表中。
例如:
动作EmpNo名称年龄工资
添加 5 dddd 30 32000
应用程序可以通过剥离“操作”列并将新数据读取到第二个数据帧(例如df2)并将其追加到表中。简单明了,效果很好。
df.write.format('parquet')\ .mode('append')\ .saveAsTable(canonical_hive_table)
在某些情况下,我们需要根据“操作”列删除现有记录或进行更新。
例如:
动作EmpNo名称年龄工资
删除 2 bbbb 38 20000
更新 4 dddd 30 42000
在上面的示例中,应用程序需要删除EmpNo:2并更新EmpNo:4。
最终输出应如下所示:
EmpNo名称年龄工资
1 aaaa 28 30000
3 cccc 26 25000
4 dddd 30 42000
5 dddd 30 32000
据我了解,Spark Sql中不提供更新操作,而且数据帧是不可变的,无法更改记录。
有人遇到这种情况吗?还是知道使用PySpark更新Hive表中现有记录的任何选项?
Pls:应用程序需要定期处理数百万条记录上的数千个更新。
谢谢。
答案 0 :(得分:0)
在大多数情况下,您需要使用正确的工具和方法-并意识到任何局限性; Hadoop基本上是一成不变的。
数据帧可以以不同的模式保存,但不能选择性地更新记录-pyspark或scala或R或JAVA与它无关,但Cloudera的KUDU Storage Manager除外,该管理器具有DF Writer可以使用的Spark连接器,但是,当我上次使用此功能时,管理员并不喜欢它的安全性限制。
你能做什么?
使用MERGE,可以压缩分区中的小型Hadoop Hive文件,但前提是格式为ORC(如果内存正确使用)。我将不得不在这里刷新我的记忆,可能是它已在较新的版本和API中更改。
此外:
需要考虑的几件事。祝你好运。