基于PySpark和HBase中另一个表的索引高效扫描表
我是新来这里的。 我有两个表,1:索引表和2:值表,如图所示。基于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进行扫描,获得与给定索引对应的值
然后我有多个这样的(键索引)表和(索引值)表。 请让我知道进行这些扫描的最有效和最简单的方法。 我想知道一种方法:
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是第二个具有索引和值的表数据。