我在MemSQL中有一个列存储表,该表具有类似于以下内容的架构:
CREATE TABLE key_metrics (
source_id TEXT,
date TEXT,
metric1 FLOAT,
metric2 FLOAT,
…
SHARD KEY (source_id, date) USING CLUSTERED COLUMNSTORE
);
我有一个Spark应用程序(与Spark Job Server运行),用于查询MemSQL表。以下是我正在执行的Dataframe操作的简化形式(在Scala中):
sparkSession
.read
.format(“com.memsql.spark.connector”)
.options( Map (“path” -> “dbName.key_metrics”))
.load()
.filter(col(“source_id”).equalTo(“12345678”)
.filter(col(“date”)).isin(Seq(“2019-02-01”, “2019-02-02”, “2019-02-03”))
通过查看物理计划,我已经确认这些过滤谓词已下推到MemSQL。
我还检查了表中分区的分布情况:
±--------------±----------------±-------------±-------±-----------+
| DATABASE_NAME | TABLE_NAME | PARTITION_ID | ROWS | MEMORY_USE |
±--------------±----------------±-------------±-------±-----------+
| dbName | key_metrics | 0 | 784012 | 0 |
| dbName | key_metrics | 1 | 778441 | 0 |
| dbName | key_metrics | 2 | 671606 | 0 |
| dbName | key_metrics | 3 | 748569 | 0 |
| dbName | key_metrics | 4 | 622241 | 0 |
| dbName | key_metrics | 5 | 739029 | 0 |
| dbName | key_metrics | 6 | 955205 | 0 |
| dbName | key_metrics | 7 | 751677 | 0 |
±--------------±----------------±-------------±-------±-----------+
我的问题是关于分区下推。据我了解,有了它,我们可以使用机器的所有核心并利用并行性进行批量加载。根据文档,这是通过创建与MemSQL数据库分区一样多的Spark任务来完成的。
但是,当运行Spark管道并观察Spark UI时,似乎只创建了一个Spark任务,该任务对在单个内核上运行的DB进行单个查询。
我确保还设置了以下属性:
spark.memsql.disablePartitionPushdown = false
spark.memsql.defaultDatabase = “dbName”
我对分区下推的理解不正确吗?我还有其他配置吗?
感谢您对此的投入。
谢谢!