【问题标题】:Updating HBase from PySpark using Phoenix使用 Phoenix 从 PySpark 更新 HBase
【发布时间】:2018-06-16 00:50:57
【问题描述】:

我正在尝试使用 Phoenix 连接器从 PySpark 读取和写入 HBase。

我在https://phoenix.apache.org/phoenix_spark.html 中看到了示例代码 在此复制示例代码以方便参考:

df.write \
  .format("org.apache.phoenix.spark") \
  .mode("overwrite") \
  .option("table", "TABLE1") \
  .option("zkUrl", "localhost:2181") \
  .save()

我已经能够从 pyspark 读写到 hbase。然而,这个例子只给出了“覆盖”的模式,这意味着整个表将被覆盖。但是,我想要一个选项来从 PySpark 将数据或更新(更新插入)到 HBase。

我看到的大多数示例都是基于 scala 的,我无法获得任何关于 pyspark 支持的明确文档。

任何相同的示例代码或关于 Phoenix 连接器支持哪些其他模式的见解,我们将不胜感激。

【问题讨论】:

    标签: apache-spark pyspark hbase upsert phoenix


    【解决方案1】:

    Apache Spark SQL 通常不支持更新/更新插入。由于它不提供跨执行程序的原子事务,并且更新通常不是幂等的,因此很容易导致损坏状态,在大型数据集的情况下可能很难从中恢复。

    有时用户会使用RDD / mapPartitions 手动推送数据,但将数据推送到 Kafka 等队列中并使用更高粒度的客户端以及优雅地从错误中恢复的方式更有意义。

    【讨论】:

    • 嗨@user9182321,您的意见似乎表明它更像是一种按设计工作的Spark 方式,尽管HBase 本身提供了upsert 选项......对吗?这似乎有点奇怪,因为我看到事情超出了这一点。最近,Hive 也开始通过 ACID 事务支持来支持更新。我已经尝试并看到我可以从 Spark 更新配置单元表。 (尽管它在内部传播的方式是通过压缩,因此需要一个可见的时间段来显示更新)。因此,考虑到 HBase 支持更新,我希望 HBase 也可以从 PySpark 更新
    【解决方案2】:

    在我尝试了使用相同“覆盖”模式的数据插入和更新的各种组合之后,我意识到这种相同的模式既可以用作“追加”,也可以用作“更新”。

    HBase中是否已经存在key,更新数据,如果key不存在,则插入数据。

    但是,如果我尝试通过使用删除了一些数据的新数据框“覆盖”来删除数据,它似乎不起作用。所以,实际上,它是在做 upserts 而不是覆盖,正如这个词似乎暗示的那样。

    【讨论】:

    • df.write.mode("append").options(catalog = catalog, newtable = 4).format("org.apache.spark.sql.execution.datasources.hbase").save ()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2015-10-29
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多