使用RDD中的索引扫描Spark中的Hadoop数据库表

时间:2017-04-21 17:36:30

标签: apache-spark hbase pyspark rdd

因此,如果数据库中有一个表如下所示:

Key2 DateTimeAge AAA1 XXX XXX XXX AAA2 XXX XXX XXX AAA3 XXX XXX XXX AAA4 XXX XXX XXX AAA5 XXX XXX XXX AAA6 XXX XXX XXX AAA7 XXX XXX XXX AAA8 XXX XXX XXX BBB1 XXX XXX XXX BBB2 XXX XXX XXX BBB3 XXX XXX XXX BBB4 XXX XXX XXX BBB5 XXX XXX XXX CCC1 XXX XXX XXX CCC2 XXX XXX XXX CCC3 XXX XXX XXX CCC4 XXX XXX XXX CCC5 XXX XXX XXX CCC6 XXX XXX XXX CCC7 XXX XXX XXX DDD1 XXX XXX XXX DDD2 XXX XXX XXX DDD3 XXX XXX XXX DDD4 XXX XXX XXX DDD5 XXX XXX XXX DDD6 XXX XXX XXX DDD7 XXX XXX XXX 我有第二张桌子,给出了 1 AAA 2 DDD 3 CCC 由于AAA,DDD和CCC在表2中,我想从table1扫描对应于这3个值的所有行,即我想得到AAA1-AAA8,DDD1 -DDD7和CCC1-CCC7。 table1是一个Hadoop数据库表,有数百万行。我只想扫描它从table1获得的行。 任何人都可以用这种有效的方式帮助我吗?我将table1作为RDD,table2在HBase中。

1 个答案:

答案 0 :(得分:0)

困难的部分实际上是从HortonworksHuawei设置HBase连接器。

但无论如何我认为你是在询问查询本身,所以我很快就使用Hive构建了一个玩具示例(即使用shell创建HBase表,然后在Hive中添加create external table)。

然后我使用Hive上下文创建一个SQL上下文。

from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)

完整的玩具桌有3排:

df = sqlContext.sql("select * from hbase_table_1")
df.show(3)
+----+--------+
| key|column_1|
+----+--------+
|AAA1|    abcd|
|AAA2|    efgh|
|BBB1|    jklm|
+----+--------+

并访问HBase的一个子集rowkeys

df = sqlContext.sql("select * from hbase_table_1 where key >= 'AAA' and key < 'BBB'")
df.show(3)
+----+--------+
| key|column_1|
+----+--------+
|AAA1|    abcd|
|AAA2|    efgh|
+----+--------+

对于性能,你应该明确地选择其中一个HBase连接器,但是一旦你拥有它(至少对于Hortonworks&#39;),查询应该是相同的。