阿里云数据湖分析(DLA) 是阿里云的无服务器交互式查询和分析服务。只需运行标准 SQL 语句即可查询和分析存储在对象存储服务(OSS) 和表存储实例中的数据, 而无需移动数据。

目前, DLA 已在阿里云正式上市。您可以申请试用此箱即用数据分析服务。

访问官方文档页面, 申请欧华服务的激活。

除了纯文本文件 (如 CSV 和 TSV 文件) 之外, DLA 还可以查询和分析其他格式的数据文件, 如兽人、实木复合地板、JSON、RCFile 和 Avro。DLA 甚至可以按照 ESRI 标准和与指定正则表达式匹配的文件查询地理 JSON 数据。

本文介绍如何使用 DLA 分析基于文件格式存储在 OSS 实例中的文件。DLA 为文件处理提供了各种内置序列化程序/反序列化 (SerDes)。您可以选择一个或多个 SerDes 来匹配 OSS 实例中的数据文件格式, 而不是自行编译程序。如果 SerDes 不满足您处理特殊文件格式的需要, 请联系我们。

存储格式和 SerDe

使用 DLA 创建表后, 运行 “显示创建表” 语句查询完整表创建语句。

CREATE EXTERNAL TABLE nation (
    N_NATIONKEY INT, 
    N_NAME STRING, 
    N_REGIONKEY INT, 
    N_COMMENT STRING
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' 
STORED AS TEXTFILE 
LOCATION 'oss://test-bucket-julian-1/tpch_100m/nation';

创建表后, 查看您刚创建的表的详细信息。

mysql> show create table nation;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Result                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE EXTERNAL TABLE `nation`(
  `n_nationkey` int,
  `n_name` string,
  `n_regionkey` int,
  `n_comment` string)
ROW FORMAT SERDE
  'org

hadoop.hive.serde2.lazy.LazySimpleSerDe 与 SERDEPROPERTIES (“字段. delim” = “|”, “序列化. 格式” = “|”)
存储为 INPUTFORMAT “org.apache.hadoop.mapred.TextInputFormat” 默认 “org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat” 位置 “oss://test-bucket-julian-1/tpch_100m/nation” TBLPROPERTIES (“COLUMN_STATS_ACCURATE” = “false “、” numFiles’=’1 “、” numRows’=’-1 “、” rawDataSize’=’-1 “、” totalSize’=’2224 “、” transient_lastDdlTime’=’1528440011 “) |
+———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————–+ 1 行 (1.81 秒)

如果将表创建语句与表的详细信息进行比较, 您会注意到在表创建语句中存储为符合已被行格式 SERDE 替换.。存储为 INPUTFORMAT..。默认.

DLA 使用 INPUTFORMAT 读取存储在 OSS 实例中的数据文件, 并使用 SERDE 从文件中解析表记录。

下表列出了 DLA 当前支持的文件格式。若要为下列任何格式的文件创建表, 只需运行 “存储为”。DLA 选择合适的 SERDE、INPUTFORMAT 和默认。

存储格式 描述
存储为符合 数据文件以纯文本格式存储。这是默认的文件格式。文件中的每一行对应于表中的记录。常见的 JSON 数据也属于此类型。
作为兽人存储 数据文件以 ORC 格式存储。
存储为实木复合地板 数据文件以镶木格式存储。
存储为 RCFILE 数据文件以 RCFile 格式存储。
存储为 AVRO 数据文件以 Avro 格式存储。

也可以使用指定的 SerDe 和特殊的列分隔符来运行存储。

以下部分介绍了一些示例。

例子

CSV 文件

CSV 文件实际上是纯文本文件。您可以运行存储为符合创建 CSV 文件的表。

通过运行行格式分隔字段以逗号 (,) 分隔列, 以 “,” 终止。

常见 CSV 文件

例如, 数据文件的内容 oss://存储桶用于测试/oss/文本/城市/城市. csv 如下所示:

Beijing,China,010
ShangHai,China,021
Tianjin,China,022

表创建语句如下所示:

CREATE EXTERNAL TABLE city (
    city STRING, 
    country STRING, 
    code INT
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE 
LOCATION 'oss://bucket-for-testing/oss/text/cities';

使用 OpenCSVSerde 处理带引号的字段

使用 OpenCSVSerde 时请注意以下事项:

  1. 可以为行字段指定字段分隔符、字段内容引用字符和转义符, 例如, 使用 SERDEPROPERTIES (“separatorChar” = “、”、”quoteChar” = “”、”escapeChar” = “”)。
  2. 不支持字段内的行分隔符。
  3. 所有字段都是字符串类型。
  4. 您可以使用 SQL 语句中的函数转换其他类型的数据, 然后处理数据

apache.hadoop.hive.serde2.OpenCSVSerde ‘ 与 serdeproperties (“separatorChar” = “,”, “quoteChar” = “\” “,” escapeChar “=” \\ “) 存储为符合位置” oss://test-bucket-julian-1/test_csv_serde_1 “;

自定义分隔符

您必须自定义列分隔符 (终止于的字段)、转义字符 (转义者) 和行终止符 (终止的行)。

必须在表创建语句中指定字符。

ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    ESCAPED BY '\\'
    LINES TERMINATED BY '\n'

TSV 文件

与 CSV 文件类似, TSV 文件是纯文本文件。列与选项卡隔开。

例如, 数据文件的内容 oss://存储桶用于测试/oss/文本/城市/城市. tsv 如下:

Beijing    China    010
ShangHai    China    021
Tianjin    China    022

表创建语句如下所示:

CREATE EXTERNAL TABLE city (
    city STRING, 
    country STRING, 
    code INT
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
STORED AS TEXTFILE 
LOCATION 'oss://bucket-for-testing/oss/text/cities';

具有多字符数据字段分隔符的文件

如果数据字段分隔符包含多个字符, 则可以使用下面的示例表创建语句。每个行的数据字段分隔符为 “| |”, 可以用特定的分隔符字符串替换它。

ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
with serdeproperties(
"field.delim"="||"
)

例子:

CREATE EXTERNAL TABLE test_csv_multidelimit (
  id STRING,
  name STRING,
  location STRING,
  create_date STRING,
  create_timestamp STRING,
  longitude STRING,
  latitude STRING
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
with serdeproperties(
"field.delim"="||"
)
STORED AS TEXTFILE LOCATION 'oss://bucket-for-testing/oss/text/cities/';

JSON 文件

可以由 DLA 处理的 JSON 文件存储为纯文本。创建表时, 必须运行存储为符合并定义 SERDE。

在 json 文件中, 每行必须包含一个完整的 json 对象。

例如, 以下文件格式是不可接受的:

{"id": 123, "name": "jack", 
"c3": "2001-02-03 12:34:56"}
{"id": 456, "name": "rose", "c3": "1906-04-18 05:12:00"}
{"id": 789, "name": "tom", "c3": "2001-02-03 12:34:56"}
{"id": 234, "name": "alice", "c3": "1906-04-18 05:12:00"}

必须将该文件更改为:

{"id": 123, "name": "jack", "c3": "2001-02-03 12:34:56"}
{"id": 456, "name": "rose", "c3": "1906-04-18 05:12:00"}
{"id": 789, "name": "tom", "c3": "2001-02-03 12:34:56"}
{"id": 234, "name": "alice", "c3": "1906-04-18 05:12:00"}

不嵌套的 JSON 数据

表创建语句如下所示:

CREATE EXTERNAL TABLE t1 (id int, name string, c3 timestamp)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 'oss://path/to/t1/directory';

具有嵌套的 JSON 文件

使用结构和数组定义嵌套的 JSON 数据。

例如, 以下是您的原始数据 (注意: 无论是否需要嵌套, 都必须将完整的 JSON 数据放在一行中, 以便 DLA 处理数据):

{       "DocId": "Alibaba",         "User_1": {             "Id": 1234,             "Username": "bob1234",          "Name": "Bob",          "ShippingAddress": {                    "Address1": "969 Wenyi West St

“,” Address2 “: 空,” 城市 “:” 杭州 “,” 省 “:” 浙江 “},” 订单 “: [{” ItemId “: 6789,” 订购日期 “”: “11/11/2017”}, {“项目Id “: 4352,” 订购日期 “”: “12/12/2017”}}}}

表创建语句如下所示 (注意: 位置中指定的路径必须是 JSON 数据文件的目录, 并且目录中的所有 JSON 文件必须标识为表数据):

CREATE EXTERNAL TABLE json_table_1 (
    docid string,
    user_1 struct<
            id:INT,
            username:string,
            name:string,
            shippingaddress:struct<
                            address1:string,
                            address2:string,
                            city:string,
                            province:string
                            >,
            orders:array<
                    struct<
                        itemid:INT,
                        orderdate:string
                    >
            >
    >
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 'oss://xxx/test/json/hcatalog_serde/table_1/';

查询表:

select * from json_table_1;

+---------+----------------------------------------------------------------------------------------------------------------+
| docid   | user_1                                                                                                         |
+---------+----------------------------------------------------------------------------------------------------------------+
| Alibaba | [1234, bob1234, Bob, [969 Wenyi West St., null, Hangzhou, Zhejiang], [[6789, 11/11/2017], [4352, 12/12/2017]]] |
+---------+----------------------------------------------------------------------------------------------------------------+

对于由结构定义的嵌套结构, 可以对层次对象引用使用 “.”。对于由数组定义的数组结构, 可以对对象引用使用 “[数组下标]” (注: 数组下标从1开始)。

select DocId,
       User_1.Id,
       User_1.ShippingAddress.Address1,
       User_1.Orders[1].ItemId
from json_table_1
where User_1.Username = 'bob1234'
  and User_1.Orders[2].OrderDate = '12/12/2017';

+---------+------+--------------------+-------+
| DocId   | id   | address1           | _col3 |
+---------+------+--------------------+-------+
| Alibaba | 1234 | 969 Wenyi West St. |  6789 |
+---------+------+--------------------+-------+

使用 JSON 函数处理数据

例如, 将 “value_string” 的嵌套 JSON 值存储为字符串:

{"data_key":"com.taobao.vipserver.domains.meta.biz.alibaba.com","ts":1524550275112,"value_string":"{\"appName\":\"\",\"apps\":[],\"checksum\":\"50fa0540b430904ee78dff07c7350e1c\",\"clusterMap\":{\"DEFAULT\":{\"defCkport\":80,\"defIPPort\":80,\"healthCheckTask\":null,\"healthChecker\":{\"checkCode\":200,\"curlHost\":\"\",\"curlPath\":\"/status.taobao\",\"type\":\"HTTP\"},\"name\":\"DEFAULT\",\"nodegroup\":\"\",\"sitegroup\":\"\",\"submask\":\"0.0.0.0/0\",\"syncConfig\":{\"appName\":\"trade-ma\",\"nodegroup\":\"tradema\",\"pubLevel\":\"publish\",\"role\":\"\",\"site\":\"\"},\"useIPPort4Check\":true}},\"disabledSites\":[],\"enableArmoryUnit\":false,\"enableClientBeat\":false,\"enableHealthCheck\":true,\"enabled\":true,\"envAndSites\":\"\",\"invalidThreshold\":0.6,\"ipDeleteTimeout\":1800000,\"lastModifiedMillis\":1524550275107,\"localSiteCall\":true,\"localSiteThreshold\":0.8,\"name\":\"biz.alibaba.com\",\"nodegroup\":\"\",\"owners\":[\"junlan.zx\",\"张三\",\"李四\",\"cui.yuanc\"],\"protectThreshold\":0,\"requireSameEnv\":false,\"resetWeight\":false,\"symmetricCallType\":null,\"symmetricType\":\"warehouse\",\"tagName\":\"ipGroup\",\"tenantId\":\"\",\"tenants\":[],\"token\":\"1cf0ec0c771321bb4177182757a67fb0\",\"useSpecifiedURL\":false}"}

使用联机 JSON 格式设置工具进行格式化后, 数据内容如下所示:

{
    "data_key": "com

vipserver.domains.meta.biz.alibaba.com “,” ts “: 1524550275112,” value_string “:” {\ “appName \”: \ “\”, \ “应用程序 \”: [], \ “校验和 \”: \ “50fa0540b430904ee78dff07c7350e1c \”, \ “clusterMap \”: {\ “默认 \”: {\ “defCkport \”:80, \ “defIPPort \”:80, \ “healthCheckTask \ “: null, \” healthChecker \ “: {\” 答案 \ “: 200, \” curlHost \ “: \” \ “, \” curlPath \ “: \”/状态. 淘宝 \ “, \” 类型 \ “: \” HTTP \ “}, \” 名称 \ “: \” 默认 \ “, \” 节点组 \ “: \” \ “, \” sitegroup \ “: \” \ “, \” submask \ “: \” 0.0. 0.0/0 \ “, \”syncConfig \ “: {\” appName \ “: \” 交易-ma \ “, \” 节点组 \ “: \” tradema \ “, \” pubLevel \ “: \” 发布 \ “, \” 角色 \ “: \” \ “, \” 站点 \ “: \” \ “}, \” useIPPort4Check \ “: true}}, \” disabledSites \ “: [], \” enableArmoryUnit \ “: false, \” enableClientBeat \ “: false, \”enableHealthCheck \ “: true, \” 已启用 \ “: true, \” envAndSites \ “: \” \ “, \” invalidThreshold \ “: 0.6, \” ipDeleteTimeout \ “: 1800000, \” lastModifiedMillis \ “: 1524550275107, \” localSiteCall \ “: 真, \” localSiteThreshold \ “: 0.8, \” 名称 \ “: \”biz.alibaba.com \ “, \” 节点组 \ “: \” \ “, \” 所有者 \ “: [\” 冯君 “, \” 张三 \ “, \” 李四 \ “, \” cui yuanc \ “], \” protectThreshold \ “: 0, \” requireSameEnv \ “: false, \” resetWeight \ “: false, \” symmetricCallType \ “: 空, \” symmetricType \ “: \” 仓库 \ “, \”tagName \ “: \” ipGroup \ “, \” tenantId \ “: \” \ “, \” 租户 \ “: [], \” 令牌 \ “: \” 1cf0ec0c771321bb4177182757a67fb0 \ “, \” useSpecifiedURL \ “: false}”}

表创建语句如下所示:

CREATE external TABLE json_table_2 (
   data_key string,
   ts bigint,
   value_string string
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 'oss://xxx/test/json/hcatalog_serde/table_2/';

创建表后, 查询它:

select * from json_table_2;

+---------------------------------------------------+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+---------------------------------------------------+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| com.taobao.vipserver.domains.meta.biz.alibaba.com | 1524550275112 | {"appName":"","apps":[],"checksum":"50fa0540b430904ee78dff07c7350e1c","clusterMap":{"DEFAULT":{"defCkport":80,"defIPPort":80,"healthCheckTask":null,"healthChecker":{"checkCode":200,"curlHost":"","curlPath":"/status

0.0. 0/0 “,” syncConfig “: {” appName “:” 交易-ma “,” 节点组 “:” tradema “,” pubLevel “:” 发布 “,” 角色 “:” “,” 网站 “:”}, “useIPPort4Check”: 真}}, “disabledSites”: [], “enableArmoryUnit”: false, “enableClientBeat”: false, “enableHealthCheck”:true, “启用”: 真, “envAndSites”: “”, “invalidThreshold”: 0.6, “ipDeleteTimeout”: 1800000, “lastModifiedMillis”: 1524550275107, “localSiteCall”: true, “localSiteThreshold”: 0.8, “名称”: “biz.alibaba.com”, “节点组”: “,” 所有者 “: [“冯君. zx “,” 张三 “,” 李四 “,” 崔 yuanc “],” protectThreshold “: 0,” requireSameEnv “: 假,” resetWeight “: 假,” symmetricCallType “: 空,” symmetricType “:” 仓库 “,” tagName “:” ipGroup “,” tenantId “:” “,” 租户 “: [],” 令牌 “:”1cf0ec0c771321bb4177182757a67fb0 “,” useSpecifiedURL “: false} |
+—————————————————+—————+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————+

下面的 SQL 语句是演示如何使用 json_parse、json_extract_scalar、json_extract 和其他常见 json 函数的示例:

mysql> select json_extract_scalar(json_parse(value), '$.owners[1]') from json_table_2;

+--------+
| _col0  |
+--------+
| John    |
+--------+

mysql> select json_extract_scalar(json_obj.json_col, '$.DEFAULT.submask') 
from (
  select json_extract(json_parse(value), '$.clusterMap') as json_col from json_table_2
) json_obj
where json_extract_scalar(json_obj.json_col, '$.DEFAULT.healthChecker.curlPath') = '/status.taobao';

+-----------+
| _col0     |
+-----------+
| 0.0.0.0/0 |
+-----------+

mysql> with json_obj as (select json_extract(json_parse(value), '$.clusterMap') as json_col from json_table_2)
select json_extract_scalar(json_obj.json_col, '$.DEFAULT.submask')
from json_obj 
where json_extract_scalar(json_obj.json_col, '$.DEFAULT.healthChecker.curlPath') = '/status.taobao';

+-----------+
| _col0     |
+-----------+
| 0.0.0.0/0 |
+-----------+

兽人档案

ORC 是 Apache 开源项目配置单元支持的优化的列存储文件格式。与 CSV 文件相比, ORC 文件不需要较大的存储空间, 并确保更好的查询性能。

对于 orc 文件, 您只需要在创建表时以兽人的形式运行存储。

例如,

CREATE EXTERNAL TABLE orders_orc_date (
    O_ORDERKEY INT, 
    O_CUSTKEY INT, 
    O_ORDERSTATUS STRING, 
    O_TOTALPRICE DOUBLE, 
    O_ORDERDATE DATE, 
    O_ORDERPRIORITY STRING, 
    O_CLERK STRING, 
    O_SHIPPRIORITY INT, 
    O_COMMENT STRING
) 
STORED AS ORC 
LOCATION 'oss://bucket-for-testing/datasets/tpch/1x/orc_date/orders_orc';

实木复合地板文件

实木复合地板是 Apache 开源项目 Hadoop 支持的专栏存储文件格式。

使用 DLA 创建表时, 必须运行存储为实木复合地板。

例如,

CREATE EXTERNAL TABLE orders_parquet_date (
    O_ORDERKEY INT, 
    O_CUSTKEY INT, 
    O_ORDERSTATUS STRING, 
    O_TOTALPRICE DOUBLE, 
    O_ORDERDATE DATE, 
    O_ORDERPRIORITY STRING, 
    O_CLERK STRING, 
    O_SHIPPRIORITY INT, 
    O_COMMENT STRING
) 
STORED AS PARQUET 
LOCATION 'oss://bucket-for-testing/datasets/tpch/1x/parquet_date/orders_parquet';

RCFile 文件

RCFile 是一种列存储文件格式, 可有效地在分布式系统中存储关系表结构, 并且可以有效地读取和处理

例如:

CREATE EXTERNAL TABLE lineitem_rcfile_date (
    L_ORDERKEY INT, 
    L_PARTKEY INT, 
    L_SUPPKEY INT, 
    L_LINENUMBER INT, 
    L_QUANTITY DOUBLE, 
    L_EXTENDEDPRICE DOUBLE, 
    L_DISCOUNT DOUBLE, 
    L_TAX DOUBLE, 
    L_RETURNFLAG STRING, 
    L_LINESTATUS STRING, 
    L_SHIPDATE DATE, 
    L_COMMITDATE DATE, 
    L_RECEIPTDATE DATE, 
    L_SHIPINSTRUCT STRING, 
    L_SHIPMODE STRING, 
    L_COMMENT STRING
) 
STORED AS RCFILE
LOCATION 'oss://bucke-for-testing/datasets/tpch/1x/rcfile_date/lineitem_rcfile'

Avro 文件

使用 DLA 为 Avro 文件创建表时, 必须以 Avro 的形式运行存储。定义的字段必须满足 Avro 文件的架构。

如果您不确定定义的字段是否满足架构, 请使用 Avro 提供的工具获取架构, 并相应地创建表。

Apache avro 网站下载 avro 工具-. jar 到您的本地计算机, 然后运行以下命令以获取 avro 文件的架构:

java -jar avro-tools-1.8.2.jar getschema /path/to/your/doctors.avro
{
  "type" : "record",
  "name" : "doctors",
  "namespace" : "testing.hive.avro.serde",
  "fields" : [ {
    "name" : "number",
    "type" : "int",
    "doc" : "Order of playing the role"
  }, {
    "name" : "first_name",
    "type" : "string",
    "doc" : "first name of actor playing role"
  }, {
    "name" : "last_name",
    "type" : "string",
    "doc" : "last name of actor playing role"
  } ]
}

表创建语句如下所示。name 字段对应于表中的列名, 并且类型必须转换为配置单元支持的, 如下表所示。

CREATE EXTERNAL TABLE doctors(
number int,
first_name string,
last_name string)
STORED AS AVRO
LOCATION 'oss://mybucket-for-testing/directory/to/doctors';

在大多数情况下, Avro 类型可以直接转换为相应的 Hive 类型。如果类型不具有相应的 Hive 类型, 则该类型将转换为类似的配置单元。下表描述了 Avro 类型和 Hive 类型之间的关系。

Avro 型 蜂巢类型
无效
布尔 布尔
Int Int
bigint
浮动 浮动
字节 二 进 制
字符串 字符串
记录 结构
地图 地图
列表 阵 列
联盟 联盟
枚举 字符串
固定 二 进 制

与正则表达式匹配的文件

通常, 此类型的文件以纯文本格式存储在 OSS 实例中。每行表示表中的记录, 并且可以与正则表达式匹配。

例如, Apache web 服务器日志文件属于此类型。

日志文件的内容如下所示:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
127.0.0.1 - - [26/May/2009:00:00:00 +0000] "GET /someurl/?track=Blabla(Main) HTTP/1.1" 200 5864 - "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.65 Safari/525.19"

文件的每一行都使用以下正则表达式表示, 列与空格隔开:

([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?

上述文件格式的表创建语句如下所示:

CREATE EXTERNAL TABLE serde_regex(
  host STRING,
  identity STRING,
  userName STRING,
  time STRING,
  request STRING,
  status STRING,
  size INT,
  referer STRING,
  agent STRING)
ROW FORMAT SERDE 'org

hadoop.hive.serde2.RegexSerDe ‘ 与 SERDEPROPERTIES (“输入. regex” = “([^] *) ([^] *) ([^] *) (-| \\ [[^ \]] ***]) ([^ \”] * | \ “[^ \”] *** “) (-| [0-9] *) (-| [0-9] *) (?: ([^ \ “] * | \” [^ \ “] ***”) ([^ \ “] * | \” [^ \ “] **”))
存储为符合位置 “oss://存储桶用于测试/数据集/serde/正则表达式”;

查询结果:

mysql> select * from serde_regex;
+-----------+----------+-------+------------------------------+---------------------------------------------+--------+------+---------+--------------------------------------------------------------------------------------------------------------------------+
| host      | identity | userName | time                         | request                                     | status | size | referer | agent                                                                                                                    |
+-----------+----------+-------+------------------------------+---------------------------------------------+--------+------+---------+--------------------------------------------------------------------------------------------------------------------------+
| 127.0.0.1 | -        | frank | [10/Oct/2000:13:55:36 -0700] | "GET /apache_pb.gif HTTP/1.0"               | 200    | 2326 | NULL    | NULL                                                                                                                     |
| 127.0.0.1 | -        | -     | [26/May/2009:00:00:00 +0000] | "GET /someurl/?track=Blabla(Main) HTTP/1.1" | 200    | 5864 | -       | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.65 Safari/525.19" |
+-----------+----------+-------+------------------------------+---------------------------------------------+--------+------+---------+--------------------------------------------------------------------------------------------------------------------------+

Esri ArcGIS 的地理 JSON 数据文件

DLA 支持 SerDe 处理 Esri ArcGIS 的地理 JSON 数据文件。有关地理 JSON 数据格式的详细信息, 请访问https://github.com/Esri/spatial-framework-for-hadoop/wiki/JSON-Formats.

例子:

CREATE EXTERNAL TABLE IF NOT EXISTS california_counties
(
    Name string,
    BoundaryShape binary
)
ROW FORMAT SERDE 'com.esri.hadoop.hive.serde.JsonSerde'
STORED AS INPUTFORMAT 'com.esri.json.hadoop.EnclosedJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 'oss://test_bucket/datasets/geospatial/california-counties/'

结论

上述示例表明, 阿里云数据湖分析(DLA) 支持大多数开源存储格式的文件。根据存储在 OSS 实例中的文件的格式和大小, DLA 查询和分析数据的速度会有所不同。我们建议您将文件设置为用于存储和查询的 ORC 格式。

为了加快查询速度, DLA 不断优化, 未来将支持更多数据源, 为您提供更好的大数据分析体验。

Comments are closed.