我正在使用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()
答案 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层,以进行尽可能多的过滤。