我想了解在使用Apache Spark Dataframe从非常大的HBase
表读取数据时如何正常分配。我的问题是:
sqlContext
.read
.format("org.apache.phoenix.spark")
.options(Map("table" -> tableName, "zkUrl" -> zookeperHostPort))
.load()
.where($"YM" === measureYyyymm)
.where($"D".isin(measureDd:_*))
.filter($"REC_ID".startsWith("MG-") or $"REC_ID".startsWith("MP-"))
.repartition(totalCoresNumber,$"POD")
这些调用由Catalyst转换为:
SELECT * FROM LP WHERE ( YM = '201703' AND D = '03' AND REC_ID LIKE 'MG-%' OR REC_ID LIKE 'MP-%');
实际上谓词下推应该包含 WHERE 子句,因此只包含YM和D字段,而不是REC_ID。如果涉及REC_ID,则这是以错误的方式完成的,因为编写的代码应该是:
SELECT * FROM LP WHERE ( YM = '201703' AND D = '03' AND (REC_ID LIKE 'MG-%' OR REC_ID LIKE 'MP-%'));
我解决了它在中间放置一个重新分区,如下所示:
sqlContext
.read
.format("org.apache.phoenix.spark")
.options(Map("table" -> tableName, "zkUrl" -> zookeperHostPort))
.load()
.where($"YM" === measureYyyymm)
.where($"D".isin(measureDd:_*))
.repartition(totalCoresNumber,$"POD")
.filter($"REC_ID".startsWith("MG-") or $"REC_ID".startsWith("MP-"))
有人可以解释这种行为吗?
问候