Spark Dataframe分区使用Phoenix从Hbase查询

时间:2017-05-23 10:35:23

标签: scala apache-spark dataframe hbase

我想了解在使用Apache Spark Dataframe从非常大的HBase表读取数据时如何正常分配。我的问题是:

  • 尝试执行阅读时是否有可能设置初始分区
  • 如果没有,如何选择分区号
  • 任何提示优化数据框阅读查询?
  • 使用 SQL API Dataframe API 创建查询时遇到了一些问题,基本上,这是我的代码:
    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-"))

有人可以解释这种行为吗?

问候

0 个答案:

没有答案