Hive 如何使用PySpark更新配置单元表中的记录?

Hive 如何使用PySpark更新配置单元表中的记录?,hive,pyspark-sql,Hive,Pyspark Sql,我们正在使用spark处理大数据,最近得到了一个新的用例,我们需要使用spark更新配置单元表中的数据 下面是一个简单的例子: 数据驻留在配置单元表中,应用程序使用PySpark读取数据帧(比如df1)。 例如:数据框有以下列 员工姓名年龄工资 1 aaaa 2830000 2 bbbb 38 20000 3中交26.25万 4 dddd 30 32000 需要使用spark向表中添加更多记录 例: 无姓名年龄工资 加上5 dddd 30 32000 应用程序可以通过剥离操作列并附加到表中,将新

我们正在使用spark处理大数据,最近得到了一个新的用例,我们需要使用spark更新配置单元表中的数据

下面是一个简单的例子: 数据驻留在配置单元表中,应用程序使用PySpark读取数据帧(比如df1)。 例如:数据框有以下列

员工姓名年龄工资

1 aaaa 2830000

2 bbbb 38 20000

3中交26.25万

4 dddd 30 32000

需要使用spark向表中添加更多记录

例:

无姓名年龄工资

加上5 dddd 30 32000

应用程序可以通过剥离操作列并附加到表中,将新数据读入第二个数据帧(比如df2)。这是直截了当的,而且效果非常好

df.write.format('parquet')\ .mode('append')\ .saveAsTable(规范配置单元表)

在某些情况下,我们需要删除现有记录或根据“操作”列进行更新

例:

无姓名年龄工资

删除2 bbbb 38 20000

更新4 dddd 30 42000

在上面的示例中,应用程序需要删除EmpNo:2并更新EmpNo:4

最终输出应如下所示:

员工姓名年龄工资

1 aaaa 2830000

3中交26.25万

4 dddd 3042000

5 dddd 30 32000

据我所知,Spark Sql中不提供更新操作,而且数据帧是不可变的,不能更改记录

有人遇到过这种情况吗?或者知道使用PySpark更新配置单元表中现有记录的任何选项吗

Pls:应用程序需要定期处理数百万条记录上的数千条更新


提前感谢。

在大多数情况下,你需要使用正确的工具和方法,并认识到任何限制;Hadoop基本上是不可变的

数据帧可以以不同的模式保存,但不能选择性地更新记录-pyspark、scala、R或JAVA与此无关,Cloudera的KUDU Storage manager除外,它有一个火花连接器,DF编写器可以使用,但在我上次使用它时,存在管理员不喜欢的安全限制

你能做什么

  • 使用KUDU,它是可变的,但我怀疑这不是一个选项。它就像镶木地板柱,从我的经验来看,性能相当。
  • 使用或不使用DF,并使用ORC文件而不是拼花进行持久化,这些文件也是柱状的,可以在脚本中使用配置单元的合并语句进行更新,也可以在启用配置单元支持的情况下使用Spark SQL进行更新。此选项意味着忘记拼花地板。此链接提供了一些有趣的见解:
  • 在DF's and what not中执行您的操作,并重新声明(即再次写入)所有数据,并写入拼花地板表/目录的两个版本中的一个(分区与否),并添加一个视图层以在当前和新版本视图之间切换。这是在没有使用兽人时完成的
  • 使用MERGE,可以在分区内压缩小的Hadoop配置单元文件,但只有在格式为ORC的情况下——如果内存使用正确的话。我将不得不在这里刷新我的记忆,可能是它在新版本和API中发生了变化

    此外:

  • 所以,你有几个选择,其中一个不需要做所有的火花与东风的
  • Databricks也有这种类型的增量表
  • 如果您使用的是从RDBMS.s导入的JDBC,那么您可以在akward方式下使用sqoop和外部表来获取更新的数据,但我不能从这个问题中看出这一点。逻辑如下:

  • 有几件事需要考虑。祝你好运。

    非常感谢你的指点。他们很有帮助,需要深入研究一些选项并决定前进的方向。好吧,我祝你成功,并希望你接受答案。我曾经遇到过这些问题,有各种各样的选择。您是否试图在每日增量负载上使用配置单元执行和升级(插入+更新)?如果是这样的话,那就是每天的覆盖。我们可能需要比这里的逻辑多一点来起草一个解决方案。你是怎么做到的?