Apache spark 如何通过Spark作业向HBase发送删除查询
我有一个自动化SparkSQL作业的用例,我想在其中执行以下操作: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
下面是一个更直观地解释的模式:
下面是一些代码 在数据帧中收集负值:
// 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