5分钟教你搞定DLI SDK
1 DLI SDK是什么
数据湖探索软件开发工具包(Data Lake Insight Software Development Kit,简称DLI SDK)是对DLI提供的REST API进行的封装,以简化用户的开发工作。用户直接调用DLI SDK提供的接口函数即可实现使用DLI业务能力的目的。
1.1 如何下载DLI SDK
用户需注册登录后进入控制台,点击右上角的常用链接,下拉框中选择DLI Client进行下载,下载完成后为一个jar包。
1.2 环境准备
1.2.1 要准备的开发环境如下:
1.2.2 操作步骤
从Oracle官网下载并安装JDK1.8版本,配置好JAVA环境变量。
安装JDK。
配置环境变量,在“控制面板”选择“系统”属性,单击“环境变量”。
选择“系统变量”,新建 “JAVA_HOME 变量”,路径配置为JDK安装路径,例如:“D:\Java\jdk1.8.0_45”。
编辑 “Path 变量”,在“变量值”中增加“%JAVA_HOME%\bin;”。
新建 “CLASSPATH 变量”,在“变量值”中填写 “.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”。
检验是否配置成功,运行cmd ,输入 java -version。运行结果,请参见图1,显示版本信息,则说明安装和配置成功。
图1 检验配置是否成功
2.从Eclipse官网下载并安装Eclipse IDE for Java Developers最新版本。在Eclipse中配置好JDK。
创建新工程,选择JRE版本,请参见图2
图2 创建新工程
配置并导入SDKjar包。
在工程“JRE System Library”上单击右键,选择“Build Path”>“Configure Build Path”,请参见图3。
图3 配置工程路径
b. 单击“Add External JARs”,选择SDK下载的jar包,单击OK。
图4 选择SDK jar包
1.3 使用SDK
1. 使用DLI SDK工具访问DLI,需要用户初始化DLI客户端。用户可以使用AK/SK(Access Key ID/Secret Access Key)或Token两种认证方式初始化客户端,示例代码如下:
*AK/SK认证方式样例代码
String ak = "ak";
String sk = "sk";
String regionName = "regionname";
String projectId = "project_id";
DLIInfo DLIInfo = new DLIInfo(regionName, ak, sk, projectId);
DLIClient client = new DLIClient(AuthenticationMode.AKSK, DLIInfo);
说明:
a. AK/SK的获取方式请参见《统一身份认证服务用户指南》的如何管理访问密钥章节。
b.项目ID的获取方式请参见《统一身份认证服务用户指南》的如何查看项目ID章节。
c.在地区和终端节点,获取DLI对应的regionname.
* Token认证方式样例代码
String domainName = "domainname";
String userName = "username";
String password = "password";
String regionName = "regionname";
String projectId = "project_id";
DLIInfo DLIInfo = new DLIInfo(regionName, domainName, userName, password, projectId);
DLIClient client = new DLIClient(AuthenticationMode.TOKEN, DLIInfo);
2. 初始化完成后,我们可以创建队列和数据库/表
a.创建和删除队列:
DLI提供创建队列的接口,您可以使用该接口创建队列。示例代码如下:
private static void createQueue(DLIClient client) throws DLIException {
//通过调用DLIClient对象的createQueue方法创建队列
String qName = "queueName";
int cu = 4;
ChargingMode mode = ChargingMode.CHARGING_MODE_SQL;
String description = "test for sdk";
Queue queue = client.createQueue(qName, cu, mode, description);
System.out.println("---------- createQueue success ---------");
}
DLI提供删除队列的接口,您可以使用该接口删除队列。示例代码如下:
private static void deleteQueue(DLIClient client) throws DLIException {
//调用DLIClient对象的getQueue(queueName)方法获取queueName这个队列
Queue queue = client.getQueue(queueName);
//使用deleteQueue()方法删除queueName队列
queue.deleteQueue();
}
b.创建数据库
您可以使用DLI提供的接口创建数据库,示例代码如下:
private static Database createDatabase(DLIClient client) throws DLIException {
//通过调用DLIClient对象的createDatabase方法创建数据库
Database database = client.createDatabase(dbName);
System.out.println("create database:" + database);
return database;
}
c.创建和查询DLI表和OBS表
您可以使用DLI提供的接口创建数据存储在DLI内部的表。示例代码如下:
private static Table createDLITable(Database database) throws DLIException {
//构造表列集合,通过实例化Column对象构建列
List<Column> columns = new ArrayList<Column>();
Column c1 = new Column("c1", DataType.STRING, "desc for c1");
Column c2 = new Column("c2", DataType.INT, "desc for c2");
Column c3 = new Column("c3", DataType.DOUBLE, "desc for c3");
Column c4 = new Column("c4", DataType.BIGINT, "desc for c4");
Column c5 = new Column("c5", DataType.SHORT, "desc for c5");
Column c6 = new Column("c6", DataType.LONG, "desc for c6");
Column c7 = new Column("c7", DataType.SMALLINT, "desc for c7");
Column c8 = new Column("c8", DataType.BOOLEAN, "desc for c8");
Column c9 = new Column("c9", DataType.DATE, "desc for c9");
Column c10 = new Column("c10", DataType.TIMESTAMP, "desc for c10");
Column c11 = new Column("c11", DataType.DECIMAL, "desc for c11");
columns.add(c1);
columns.add(c2);
columns.add(c3);
columns.add(c4);
columns.add(c5);
columns.add(c6);
columns.add(c7);
columns.add(c8);
columns.add(c9);
columns.add(c10);
columns.add(c11);
List<String> sortColumns = new ArrayList<String>();
sortColumns.add("c1");
//通过调用Database对象的createDLITable方法创建DLI表
Table table = database.createDLITable(DLITblName, "desc for table", columns, sortColumns);
System.out.println(table);
return table;
}
您可以使用DLI提供的接口创建数据存储在OBS的表。示例代码如下:
private static Table createObsTable(Database database) throws DLIException {
//构造表列集合,通过实例化Column对象构建列
List<Column> columns = new ArrayList<Column>();
Column c1 = new Column("c1", DataType.STRING, "desc for c1");
Column c2 = new Column("c2", DataType.INT, "desc for c2");
Column c3 = new Column("c3", DataType.DOUBLE, "desc for c3");
Column c4 = new Column("c4", DataType.BIGINT, "desc for c4");
Column c5 = new Column("c5", DataType.SHORT, "desc for c5");
Column c6 = new Column("c6", DataType.LONG, "desc for c6");
Column c7 = new Column("c7", DataType.SMALLINT, "desc for c7");
Column c8 = new Column("c8", DataType.BOOLEAN, "desc for c8");
Column c9 = new Column("c9", DataType.DATE, "desc for c9");
Column c10 = new Column("c10", DataType.TIMESTAMP, "desc for c10");
Column c11 = new Column("c11", DataType.DECIMAL, "desc for c11");
columns.add(c1);
columns.add(c2);
columns.add(c3);
columns.add(c4);
columns.add(c5);
columns.add(c6);
columns.add(c7);
columns.add(c8);
columns.add(c9);
columns.add(c10);
columns.add(c11);
CsvFormatInfo formatInfo = new CsvFormatInfo();
formatInfo.setWithColumnHeader(true);
formatInfo.setDelimiter(",");
formatInfo.setQuoteChar("\"");
formatInfo.setEscapeChar("\\");
formatInfo.setDateFormat("yyyy/MM/dd");
formatInfo.setTimestampFormat("yyyy-MM-dd HH:mm:ss");
//通过调用Database对象的createObsTable方法创建OBS表
Table table = database.createObsTable(obsTblName, "desc for table",columns, StorageType.DLI_CSV, dataPath, formatInfo);
System.out.println(table);
return table;
}
您可以使用DLI提供的接口查询数据库下的所有表。示例代码如下:
private static void listTables(Database database) throws DLIException {
//调用Database对象的listAllTables方法查询数据库下的所有表
List<Table> tables = database.listAllTables(true);
for (Table table : tables) {
System.out.println(table);
}
}
3. 执行SQL语句和作业查询
a.执行SQL语句(提交SQL查询作业)
您可以使用DLI提供的接口执行查询并获取查询结果。示例代码如下:
//实例化SQLJob对象,传入执行SQL所需的queue,数据库名,SQL语句
private static void runSqlJob(Queue queue, Table obsTable) throws DLIException {
String sql = "select * from " + obsTable.getTableName();
String queryResultPath = “s3a://dli/sdk/resultData”;
SQLJob sqlJob = new SQLJob(queue, obsTable.getDb().getDatabaseName(),sql);
System.out.println("start submit SQL job...");
//调用SQLJob对象的submit接口提交查询作业
sqlJob.submit();
//调用SQLJob对象的getStatus接口查询作业状态
JobStatus status = sqlJob.getStatus();
System.out.println(status);
System.out.println("start export Result...");
//调用SQLJob对象的exportResult接口导出查询结果,其中queryResultPath为导出数据的路径
sqlJob.exportResult(queryResultPath, StorageType.CSV,
CompressType.GZIP,ExportMode.ERRORIFEXISTS, null);
System.out.println("Job id: " + sqlJob.getJobId() + ", Status : " + status.getName());
}
b . 通过条件过滤获取作业信息
您可以使用DLI提供的接口查询当前工程下的所有作业信息。示例代码如下:
//返回JobResultInfo List集合
List<JobResultInfo> jobResultInfos = client.listAllJobs();
//遍历List集合查看Job信息
for (JobResultInfo jobResultInfo : jobResultInfos) {
//job id
System.out.println(jobResultInfo.getJobId());
//job 描述信息
System.out.println(jobResultInfo.getDetail());
//job 状态
System.out.println(jobResultInfo.getJobStatus());
//job 类型
System.out.println(jobResultInfo.getJobType());
}
//通过JobType过滤
List<JobResultInfo> jobResultInfos = client.listAllJobs(JobType.DDL);
//通过起始时间和JobType过滤,起始时间的格式为unix时间戳
List<JobResultInfo> jobResultInfos = client.listAllJobs(1502349803729L,1502349821460L,JobType.DDL);
//通过分页过滤
List<JobResultInfo> jobResultInfos = client.listAllJobs(100,1,JobType.DDL);
//分页,起始时间,Job类型
List<JobResultInfo> jobResultInfos = client.listAllJobs(100,1,1502349803729L,1502349821460L,JobType.DDL);
4.更详细的SDK使用请参考https://support.huaweicloud.com/devg-uquery/uquery_04_0007.html
Data Lake Insight 官网地址:https://www.huaweicloud.com/product/dli.html
Data Lake Insight 体验地址:http://49.4.0.83:8080/#/main/queryEditor
Data Lake Insight 文档中心:https://support.huaweicloud.com/usermanual-uquery/zh-cn_topic_0068141086.html
Data Lake Insight 论坛地址:https://forum.huaweicloud.com/forum-599-1.html
- 点赞
- 收藏
- 关注作者
评论(0)