阿里云数据湖分析(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
  'orghadoop.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 时请注意以下事项:
- 可以为行字段指定字段分隔符、字段内容引用字符和转义符, 例如, 使用 SERDEPROPERTIES (“separatorChar” = “、”、”quoteChar” = “”、”escapeChar” = “”)。
- 不支持字段内的行分隔符。
- 所有字段都是字符串类型。
- 您可以使用 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": "comvipserver.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":"/status0.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 'orghadoop.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 不断优化, 未来将支持更多数据源, 为您提供更好的大数据分析体验。
