如何使用pyspark和shc(spark hbase连接器)从hbase读取一个表的部分数据,而不是整个数据集?

时间:2019-07-20 05:03:13

标签: python pyspark hbase

我正在使用pyspark通过shc访问hbase的表。该表具有大量记录,但是我的Spark集群只有三台服务器,并且性能很差。我认为从该hbase表中读取全部数据,然后用spark的过滤器处理它是不合理的,那么我怎么能用pyspark和shc从hbase中读取部分数据呢? 例如,我想要带有开始值,结束值或过滤器列的过滤器行键

有一种基本的读写方法,谢谢

from pyspark.sql import SparkSession
spark = SparkSession.builder.master('localhost').appName('test_1').getOrCreate()

def test_shc():
    catalog = ''.join("""{
      "table":{"namespace":"test", "name":"test_shc"},
      "rowkey":"key",
      "columns":{
      "col0":{"cf":"rowkey", "col":"key", "type":"string"},
      "col1":{"cf":"result", "col":"class", "type":"string"}
      }
      }""".split())

    data_source_format = 'org.apache.spark.sql.execution.datasources.hbase'
    df = spark.sparkContext.parallelize([('a', '1.0'), ('b', '2.0')]).toDF(schema=['col0', 'col1'])
    df.show()
    df.write.options(catalog=catalog, newTable="5").format(data_source_format).save()
    df_read = spark.read.options(catalog=catalog).format(data_source_format).load()
    df_read.show()

2 个答案:

答案 0 :(得分:0)

使用

spark.read.options(catalog=catalog).format(data_source_format).load().limit(n)

在加载数据时。 limit(n)将限制将要读取的记录量。

答案 1 :(得分:0)

从那时起,您可能已经找到了答案...但是,可以避免加载整个文件的方式,但是只有您想要的行才是您所说的,换句话说,就是基于之后的行键应用过滤器正在加载。
这样, SHC不会加载整个表,因为过滤器将被向下推到HBase上,并且只有过滤器中的数据才会返回到Spark,如您在此处看到的:https://github.com/hortonworks-spark/shc/issues/108

def withCatalog(cat: String): DataFrame = {
  sqlContext 
  .read
  .options(Map(HBaseTableCatalog.tableCatalog->cat))
  .format("org.apache.spark.sql.execution.datasources.hbase")
  .load()
 }

请注意,对非行键列进行过滤会导致对表进行全面扫描。在这种情况下,查询不是很有效,建议的一种方法是在将数据传输到Spark之前,使用SingleColumnValueFilter将计算推送到HBase层,以进行尽可能多的过滤。

有关更多详细信息:https://www.ifi.uzh.ch/dam/jcr:fbf88795-65a3-4bc1-9a8a-60548d7f2f91/SHC%20Distributed%20Query%20Processing.pdf