Spark访问多元索引-快速开始

简介: 本文介绍如何在E-MapReduce集群中使用Spark SQL访问表格存储的多元索引。 ### 前置准备 1. 创建E-MapReduce Hadoop集群,步骤参见[E-MapReduce快速入门](https://help.aliyun.com/document_detail/65683.html)。创建时挂载公网地址,用于后续的Shell远程登陆。 ![1.png](http

本文介绍如何在E-MapReduce集群中使用Spark SQL访问表格存储的多元索引。

前置准备

  1. 创建E-MapReduce Hadoop集群,步骤参见E-MapReduce快速入门。创建时挂载公网地址,用于后续的Shell远程登陆。
    1.png

步骤一 创建Tablestore表和多元索引

  1. 创建Tablestore源表
    详细开通步骤请参考官方文档,本文demo中所创建出来的表名为geo_table, 主键列为pk1(STRING),属性列分别为val_keyword1(STRING), val_keyword2(STRING), val_keyword3(STRING),val_bool(BOOLEAN), val_double (DOUBLE), val_long1(LONG), val_long2(LONG),val_text(STRING), val_geo(STRING),数据条数为208912382,数据样例如下图所示。

2.png

  1. 在源表上开通多元索引,根据字段类型选择对应的索引Mapping,创建完成后,多元索引会自动开始同步,等待索引进入增量状态时,索引完成构建。

注意:地理位置字段建索引的时候,选择地理位置类型而非字符串类型.

3.png
4.png

步骤二 创建Spark外表

  1. 上传表格存储开发提供的emr-tablestore_shaded_2.11-2.1.0-SNAPSHOT.jar包到EMR Header机器上。

注:Spark访问多元索引的jar包为预览版,尚未正式发布,后续可以通过maven方式引入。

  1. 使用以下命令,启动spark-sql命令行,用于外表创建和后续的SQL实战。其中Spark的标准启动参数 --num-executors 64 --executor-memory 2g --executor-cores 1 ,可以根据具体的集群配置进行自定义调整。
spark-sql --driver-class-path emr-tablestore_shaded_2.11-2.1.0-SNAPSHOT.jar --jars emr-tablestore_shaded_2.11-2.1.0-SNAPSHOT.jar --master yarn --num-executors 64 --executor-memory 2g --executor-cores 1
  1. 创建Spark外表同时连接多元索引,各个参数的说明如下:

    • endpoint: 表格存储实例访问地址,EMR集群里使用VPC地址。
    • access.key.id: 阿里云账号AK ID。
    • access.key.secret: 阿里云账号AK Secret。
    • instance.name: 实例名。
    • table.name: Tablestore表名。
    • search.index.name: 多元索引名。
    • max.split.count: 多元索引Parallel Scan的查询并发度,并发数和Spark的Split数对应。
    • push.down.range.long: 与Long类型做Range( >= > < <= )比较的谓词是否下推
    • push.down.range.string: 与String类型做Range( >= > < <= )比较的谓词是否下推
DROP TABLE IF EXISTS geo_table;
CREATE TABLE geo_table (
pk1 STRING, val_keyword1 STRING, val_keyword2 STRING, val_keyword3 STRING, 
val_bool BOOLEAN, val_double DOUBLE, val_long1 LONG, val_long2 LONG,
val_text STRING, val_geo STRING COMMENT "geo stored in string format"
)
USING tablestore
OPTIONS(
endpoint="https://sparksearchtest.cn-hangzhou.vpc.tablestore.aliyuncs.com",
access.key.id="",
access.key.secret="",
instance.name="sparksearchtest",
table.name="geo_table",
search.index.name="geo_table_index",
max.split.count=64,
push.down.range.long = false,
push.down.range.string = false
);

步骤三 SQL查询实战

以下仅演示一些SQL查询样例,具体的SQL可以根据业务进行灵活的组合。

全表索引查询

全索引表查询:SELECT COUNT(*) FROM geo_table;

  • 测试数据208912382条,配置64个Parallel Scan并发,实际耗时165.208s,平均QPS约126.45w。
208912382
Time taken: 165.208 seconds, Fetched 1 row(s)
20/06/29 20:55:11 INFO [main] SparkSQLCLIDriver: Time taken: 165.208 seconds, Fetched 1 row(s)

组合条件查询

  • 测试SQL:SELECT val_long1, val_long2, val_keyword1, val_double FROM geo_table WHERE (val_long1 > 17183057 AND val_long1 < 27183057) AND (val_long2 > 1000 AND val_long2 < 5000) LIMIT 100;
  • Spark会将Projection列和Filter下推到多元索引,实际耗时2.728s,极大加快查询效率。
21423964        4017    aaa     2501.9901650365096
21962236        2322    eio     2775.9021545044116
Time taken: 2.894 seconds, Fetched 100 row(s)
20/06/30 18:51:24 INFO [main] SparkSQLCLIDriver: Time taken: 2.894 seconds, Fetched 100 row(s)

GEO条件查询

GEO支持三种查询,距离查询,距离长方形查询和距离多边形查询,GEO查询也会被下推到多元索引层,示例如下, 其中val_geo为GEO字段名,坐标的格式都为"纬度,经度"。

  1. 地理距离查询, 语法为val_geo = '{"centerPoint":"中心点坐标", "distanceInMeter": 距离中心点的距离}'

    • SELECT COUNT(*) FROM search_view WHERE val_geo = '{"centerPoint":"6.530045901643962,9.05358919674954", "distanceInMeter": 3000.0}';
  2. 地理长方形查询: 语法为val_geo = '{"topLeft":"矩形框的左上角的坐标", "bottomRight": "矩形框的右下角的坐标"}'。

    • SELECT COUNT(*) FROM search_view WHERE val_geo = '{"topLeft":"6.257664116603074,9.1595116589601", "bottomRight": "6.153593333442616,9.25968497923747"}';
  3. 地理多边形范围查询: 语法为val_geo = '{"points":["坐标1", "坐标2", .... "坐标n-1", "坐标n"]}'。

    • SELECT COUNT(*) FROM search_view WHERE val_geo = '{"points":["6.530045901643962,9.05358919674954", "6.257664116603074,9.1595116589601", "6.160393397574926,9.256517839929597", "6.16043846779313,9.257192872563525"]}'
相关实践学习
阿里云表格存储使用教程
表格存储(Table Store)是构建在阿里云飞天分布式系统之上的分布式NoSQL数据存储服务,根据99.99%的高可用以及11个9的数据可靠性的标准设计。表格存储通过数据分片和负载均衡技术,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。 产品详情:https://www.aliyun.com/product/ots
目录
相关文章
|
7月前
|
SQL 分布式计算 数据安全/隐私保护
如何杜绝 spark history server ui 的未授权访问? 1
如何杜绝 spark history server ui 的未授权访问?
|
11天前
|
存储 分布式计算 API
adb spark的lakehouse api访问内表数据,还支持算子下推吗
【2月更文挑战第21天】adb spark的lakehouse api访问内表数据,还支持算子下推吗
108 2
|
11天前
|
分布式计算 分布式数据库 API
Spark与HBase的集成与数据访问
Spark与HBase的集成与数据访问
|
7月前
|
分布式计算 Hadoop 大数据
如何杜绝 spark history server ui 的未授权访问? 2
如何杜绝 spark history server ui 的未授权访问?
|
分布式计算 Hadoop Java
Hadoop/Spark 访问 OSS 加速 | 学习笔记
快速学习Hadoop/Spark 访问 OSS 加速。
432 0
|
存储 分布式计算 大数据
SPARK Parquet嵌套类型的向量化支持以及列索引(column index)
SPARK Parquet嵌套类型的向量化支持以及列索引(column index)
436 0
SPARK Parquet嵌套类型的向量化支持以及列索引(column index)
|
分布式计算 Java Hadoop
Spark集群搭建记录 | 云计算[CentOS8] | Scala Maven项目访问Spark(local模式)实现单词计数(下)
step6 创建scala object step7 修改pom文件 step8 配置项目 step9 添加依赖库(Spark的jar包) step10 设置输入路径
145 0
Spark集群搭建记录 | 云计算[CentOS8] | Scala Maven项目访问Spark(local模式)实现单词计数(下)
|
分布式计算 IDE Java
Spark集群搭建记录 | 云计算[CentOS7] | Scala Maven项目访问Spark(local模式)实现单词计数(上)
写在前面 step1 下载Scala IDE step2 解压安装Scala IDE step3 Scala 下载 step4 Scala 配置 step5 创建scala项目
130 0
Spark集群搭建记录 | 云计算[CentOS7] | Scala Maven项目访问Spark(local模式)实现单词计数(上)
|
分布式计算 Hadoop Linux
云计算集群搭建记录[Hadoop|Zookeeper|Hbase|Spark | Docker]更新索引 |动态更新
为了能够更好的查看所更新的文章,讲该博文设为索引 小约定 为了解决在编辑文件等操作的过程中的权限问题,博主一律默认采用root账户登录 对于初次安装的用户可以采用如下命令行:
118 0
云计算集群搭建记录[Hadoop|Zookeeper|Hbase|Spark | Docker]更新索引 |动态更新