本文档所描述的内容属于神策分析的高级使用功能,涉及较多技术细节,适用于对相关功能有经验的用户参考。如果对文档内容有疑惑,请咨询神策值班同学获取一对一的协助。
概述
神策系统提供了更加高效、稳定的 SQL 查询方式,即直接使用 JDBC 或者 impala-shell 进行数据查询。关于具体如何使用 JDBC 连接 Impala 可以直接参考 官方文档。
使用方法
使用步骤
获取 JDBC 地址
- 登录任意的神策服务器
- 切换至 sa_cluster 账户
su - sa_cluster
- 使用以下命令获取地址
SP≤2.0
spadmin config get client -m impala -p sp
SP≥2.1
aradmin config get client -p sp -m impala
例如输出是:
{
"hive_url_list": [
"jdbc:hive2://192.168.1.2:21050/rawdata;auth=noSasl",
"jdbc:hive2://192.168.1.3:21050/rawdata;auth=noSasl",
],
"hive_user": "sa_cluster"
}
其中,hive_url_list 中的任意一个地址都可用于连接。
JDBC 链接访问
如果使用代码访问,我们建议使用 1.1.0 版本的 Hive JDBC Driver 来进行访问,Maven 的依赖定义如下:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.1.0</version>
</dependency>
注意:实际代码运行中,Hive JDBC Driver 会依赖其他 jar 包,主要有 hadoop-common、hive-service、hive-common 和 libthrift。正常这些 jar 包会自动获取,如果没有自动获取,需要再添加相应的 jar 包,或检查是否在 pom 中排除了对应的包,可检查代码中是否存在类似的配置:
<exclusions>
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.hive</groupId>
<artifactId>hive-service</artifactId>
</exclusion>
</exclusions>
如果包已导入,但是有其他的报错出现,则可能是存在包冲突所导致的,需要进行排包操作。
查询数据
目前,神策分析的所有数据都映射到事件表(events)和用户表(users)这两张数据表,但连接 JDBC 进行数据访问时,会显示 event_ros_p*、event_view_p* 等底层表,查询数据不需要关注这些底层表,使用事件表(events)和用户表(users)即可查询所有的事件数据和用户数据,但需要在 SQL 中加上注解来执行,例如查询默认项目的 events 数据:
SELECT user_id,distinct_id,event,time,$lib as lib FROM events WHERE `date` = CURRENT_DATE() LIMIT 10 /*SA*/;
其中的 /*SA*/ 表示当前 SQL 是一个发给神策系统的查询。类似的,如果想看 events 表有哪些字段,可以使用:
DESC events /*SA*/;
如果不是查询默认项目,则需要指定项目名称,例如:
SELECT id,first_id,second_id FROM users LIMIT 10 /*SA(test_project)*/;
最后,我们还可以让一个 SQL 的一部分使用神策的查询,其它部分使用正常的 Impala 查询,例如:
CREATE TABLE test_data AS
/*SA_BEGIN(test_project)*/ SELECT id, first_id, $city AS city FROM users LIMIT 10 /*SA_END*/;
使用这种方式,也可以很容易的实现把神策的数据和其它外部数据表进行 JOIN。
特别注意,如果您的项目开启了多对一用户关联,如果不加 /*+remapping_on*/ 注释,默认导出的是未经过多对一修复后的数据。如果需要导出多对一修复后的数据,先要保证您的 impala 版本大于等于 3.2.0.069(可咨询神策值班同学确认),然后在查询导出语句添加 /*+remapping_on*/ 注释,例如
SELECT * from events limit 1 /*SA(default)*/ /*+remapping_on*/;
注意事项
- 使用 JDBC 进行数据访问是不需要账号及密码的。
- 执行的 SQL 需加上注解来查 events 和 users 表数据。