基于PySpark和HBase中另一个表的索引高效扫描表

基于PySpark和HBase中另一个表的索引高效扫描表,hbase,pyspark,Hbase,Pyspark,我是新来这里的。 我有两个表,1:索引表和2:值表,如图所示。 我想知道一种有效的方法来完成以下工作: 扫描表1,并获取索引 对表2进行扫描,获得与给定索引对应的值 然后我有多个这样的(键索引)表和(索引值)表。 请让我知道进行这些扫描的最有效和最简单的方法。 我想知道一种方法: rdd1=scan'table1'{FILTER=>key='some value'}将获取索引值 rdd2=扫描“表2”,{STARTROW=>表1的结果} 因此,如果rdd1返回10行,那么这10行的索

我是新来这里的。 我有两个表,1:索引表和2:值表,如图所示。


我想知道一种有效的方法来完成以下工作:

  • 扫描表1,并获取索引
  • 对表2进行扫描,获得与给定索引对应的值

然后我有多个这样的(键索引)表和(索引值)表。 请让我知道进行这些扫描的最有效和最简单的方法。 我想知道一种方法:


rdd1=scan'table1'{FILTER=>key='some value'}将获取索引值
rdd2=扫描“表2”,{STARTROW=>表1的结果}

因此,如果rdd1返回10行,那么这10行的索引字段中的值将用于扫描表2并从表2中获取值。 这让我在表2中连续运行了10次扫描,结果耗费了很多时间。 我想知道一种将表2中的扫描并行化的方法,
rdd1.map(lamba x:scan table 2
给了我错误,因为我最终在扫描的内部进行了扫描,而我不能这样做。
如果您认为其他方法更有效,请提出建议。
谢谢

高效简单的方法是使用
数据帧
而不是rdd

假设你有这样的数据-

table1 = [(1,'A'),(2,'B'),(3,'C'),(4,'B')]
table2 = [('A',10),('B',20),('D',30),('E',40)]

# create the dataframes based on the data 
df1 = spark.createDataFrame(table1,schema=['k1','v1'])
df2 = spark.createDataFrame(table2,schema=['k2','v2'])

df1.show() 
+---+---+
| k1| v1|
+---+---+
|  1|  A|
|  2|  B|
|  3|  C|
|  4|  B|
+---+---+

 df2.show() 
+---+---+
| k2| v2|
+---+---+
|  A| 10|
|  B| 20|
|  D| 30|
|  E| 40|
+---+---+

# do a simple inner join and only select df2 columns
df2\
.join(df1, df1.v1==df2.k2)\
.select(df2.columns)\
.dropDuplicates()
.show()

+---+---+
| k2| v2|
+---+---+
|  B| 20|
|  A| 10|
+---+---+
仅使用RDD-

rdd1 = sc.parallelize(table1)
rdd2 = sc.parallelize(table2)

rdd2\
.join(rdd1.map(lambda x : (x[1],x[0])))\
.mapValues(lambda x: x[0])\
.distinct()\
.collect()

请删除图像并将其作为示例数据发布。同时显示您尝试过的内容以及出现的错误。“我们不允许这样做:rdd.map(另一个rdd)”没有意义?效率是一个主观的术语。@Pushkr我已经尝试了一些细节,但是我不能在这里分享数据。如果你仍然感到困惑,请让我知道,我一定会尽可能清楚地解释整个情况。嘿@Pushkr,我感谢你的解决方案。我有一个要求,那就是将数据保存在表格o中f rdds。另外,我肯定会研究内部联接。谢谢你的建议。如果你仍然对此感兴趣,我可以分享一些我拥有的实际表,也许你可以建议一个解决方案。只使用rdds更新。谢谢@Pushkr,如果你已经有rdd2,这个解决方案就可以工作。如果我没有表2作为rdd2,但必须使用扫描怎么办命令(使用rdd1每一行的STARTROW和ENDROW)?如果我还没有扫描表2并将其存储为rdd,我就不能使用join,对吗?我只想要表2中k2值位于v1中的那些行。这是什么意思?rdd2是第二个具有索引和值的表数据。