基于pyspark和hbase中另一个表的索引高效地扫描表

zdwk9cvp  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(298)

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

我想知道一种有效的方法来做以下事情:
扫描表1,得到索引
扫描表2,得到对应于给定索引的值
然后我有多个这样的(键索引)表和(索引值)表。请告诉我做这些扫描的最有效的方法。我想知道一种方法: rdd1 = scan 'table1' {FILTER => key ='some value'} # Will get Index values rdd2 = scan 'table2', {STARTROW => The Results of table 1} 因此,如果rdd1返回10行,那么这10行的索引字段中的值将用于扫描表2并从表2中获取值。这让我连续在表2上运行了10次扫描,结果消耗了很多时间。我想知道一种方法来并行表2上的扫描, rdd1.map(lamba x: scan table2 是给我错误,因为我最终有一个扫描内的扫描,我不能这样做。
如果你认为其他方法更有效,请提出建议。谢谢

bzzcjhmw

bzzcjhmw1#

做你想做的事的有效而简单的方法是使用 Dataframes 而不是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()

相关问题