Apache spark 如何通过Spark作业向HBase发送删除查询

Apache spark 如何通过Spark作业向HBase发送删除查询,apache-spark,apache-spark-sql,hbase,phoenix,Apache Spark,Apache Spark Sql,Hbase,Phoenix,我有一个自动化SparkSQL作业的用例,我想在其中执行以下操作: 使用Spark从Phoenix读取一个表(我们称之为table1),并在数据帧(我们称之为df1)中收集找到的所有负值 然后,我想从另一个表(表2)中删除记录,其中一列的值在df1中(考虑使用联接查询,但我想知道是否可以使用数据帧,以及是否有使用HBase和Spark数据帧的API) AFAIK Phoenix不直接支持通过Spark执行删除操作(如果我错了,请纠正我,如果有什么方法我很乐意听到),这就是为什么我更倾向于使用HB

我有一个自动化SparkSQL作业的用例,我想在其中执行以下操作:

  • 使用Spark从Phoenix读取一个表(我们称之为table1),并在数据帧(我们称之为df1)中收集找到的所有负值

  • 然后,我想从另一个表(表2)中删除记录,其中一列的值在df1中(考虑使用联接查询,但我想知道是否可以使用数据帧,以及是否有使用HBase和Spark数据帧的API)

  • AFAIK Phoenix不直接支持通过Spark执行删除操作(如果我错了,请纠正我,如果有什么方法我很乐意听到),这就是为什么我更倾向于使用HBase Spark API的原因


  • 下面是一个更直观地解释的模式:


    下面是一些代码

    在数据帧中收集负值:

    // Collect negative values
    val negativeValues = spark
      .sqlContext
      .phoenixTableAsDataFrame("phoenix.table1", Seq(), conf = hbaseConf)
      .select('COLUMN1)
      .where('COLUMN2.lt(0))
    
    // Send the query
    [...]
    
    从表2中删除列1位于NegativeValue中的值,因此在SQL中类似于此(如果可以将in直接应用于DF):

    我的预期结果是:

    table1
    
    column1 |   column2
            |
    123456  |   123
    234567  |   456
    345678  |   -789
    456789  |   012
    567891  |   -123
    
    
    
    table2
    
    column1 |   column2
            |
    123456  |   321
    234567  |   654
    345678  |   945 <---- same column1 as table1's, so delete
    456789  |   987
    567891  |   675 <---- same column1 as table1's, so delete
    
    表1
    第1列|第2列
    |
    123456  |   123
    234567  |   456
    345678  |   -789
    456789  |   012
    567891  |   -123
    表2
    第1列|第2列
    |
    123456  |   321
    234567  |   654
    
    345678 | 945如果需要从spark通过Phoenix(sql引擎)到Hbase运行“删除”查询,则必须创建自定义API

    可以使用以下方法:

  • 从源数据帧获取table2 rowkey列以进行删除(在table2上)
  • 构造对源数据帧的每个分区进行操作的代码,并构建“DELETE”查询。假设查询是“从表2中删除,其中column1=?”,准备它并以您看到的正确批大小作为批执行它。因为我们在数据帧的每个分区上并行执行它,所以源数据帧中的分区数驱动了并行性。因此,您可以尝试使用合适的大小对其进行重新分区,以查看合适的性能数据 如果选择跳过sql引擎,还可以使用spark hbase direct API。这里有一个这样的例子-

    table1
    
    column1 |   column2
            |
    123456  |   123
    234567  |   456
    345678  |   -789
    456789  |   012
    567891  |   -123
    
    
    
    table2
    
    column1 |   column2
            |
    123456  |   321
    234567  |   654
    345678  |   945 <---- same column1 as table1's, so delete
    456789  |   987
    567891  |   675 <---- same column1 as table1's, so delete