跳到主要内容

HDFS

描述

HDFS 表函数(table-valued-function,tvf),可以让用户像访问关系表格式数据一样,读取并访问 HDFS 上的文件内容。目前支持csv/csv_with_names/csv_with_names_and_types/json/parquet/orc文件格式。

语法

HDFS(
"uri" = "<uri>",
"fs.defaultFS" = "<fs_defaultFS>",
"hadoop.username" = "<hadoop_username>",
"format" = "<format>",
[, "<optional_property_key>" = "<optional_property_value>" [, ...] ]
);

必填参数 (Required Parameters)

参数说明
uri访问 HDFS 的 URI。如果 URI 路径不存在或文件为空,HDFS TVF 将返回空集合。
fs.defaultFSHDFS 的默认文件系统 URI
hadoop.username必填,可以是任意字符串,但不能为空。
format文件格式,必填,目前支持 csv/csv_with_names/csv_with_names_and_types/json/parquet/orc/avro

可选参数 (Optional Parameters)

上述语法中的 optional_property_key 可以按需从以下列表中选取对应的参数,optional_property_value 则为该参数的值

参数说明备注
hadoop.security.authenticationHDFS 安全认证类型
hadoop.username备用 HDFS 用户名
hadoop.kerberos.principalKerberos 主体
hadoop.kerberos.keytabKerberos 密钥表
dfs.client.read.shortcircuit启用短路读取
dfs.domain.socket.path域套接字路径
dfs.nameservicesHA 模式下的命名服务
dfs.ha.namenodes.your-nameservicesHA 模式下的 namenode 节点配置
dfs.namenode.rpc-address.your-nameservices.your-namenode指定 namenode 的 RPC 地址
dfs.client.failover.proxy.provider.your-nameservices指定 failover 的代理提供程序
column_separator列分割符,默认为 \t
line_delimiter行分割符,默认为 \n
compress_type目前支持 UNKNOWN/PLAIN/GZ/LZO/BZ2/LZ4FRAME/DEFLATE/SNAPPYBLOCK。默认值为 UNKNOWN, 将会根据 uri 的后缀自动推断类型
read_json_by_line对 JSON 格式导入,默认为 true参考:JSON Load
strip_outer_array对 JSON 格式导入,默认为 false参考:JSON Load
json_root对 JSON 格式导入,默认为空参考:JSON Load
json_paths对 JSON 格式导入,默认为空参考:JSON Load
num_as_string对 JSON 格式导入,默认为 false参考:JSON Load
fuzzy_parse对 JSON 格式导入,默认为 false参考:JSON Load
trim_double_quotes对 CSV 格式导入,布尔类型,默认为 false,为 true 时裁剪每个字段的外层双引号
skip_lines对 CSV 格式导入,整数类型,默认为 0,跳过 CSV 文件前几行,csv_with_namescsv_with_names_and_types 时失效
path_partition_keys指定文件路径中携带的分区列名,例如/path/to/city=beijing/date="2023-07-09", 则填写path_partition_keys="city,date",将会自动从路径中读取相应列名和列值进行导入
resource指定 Resource 名,HDFS TVF 可以利用已有的 HFDS Resource 来直接访问 HDFS。创建 HDFS Resource 的方法可以参照 CREATE-RESOURCE仅支持 2.1.4 及以上版本

权限控制

权限(Privilege)对象(Object)说明(Notes)
USAGE_PRIV
SELECT_PRIV

示例

  • 读取并访问 HDFS 存储上的 CSV 格式文件

    select * from hdfs(
    "uri" = "hdfs://127.0.0.1:842/user/doris/csv_format_test/student.csv",
    "fs.defaultFS" = "hdfs://127.0.0.1:8424",
    "hadoop.username" = "doris",
    "format" = "csv");
      +------+---------+------+
    | c1 | c2 | c3 |
    +------+---------+------+
    | 1 | alice | 18 |
    | 2 | bob | 20 |
    | 3 | jack | 24 |
    | 4 | jackson | 19 |
    | 5 | liming | 18 |
    +------+---------+------+
  • 读取并访问 HA 模式的 HDFS 存储上的 CSV 格式文件

    select * from hdfs(
    "uri" = "hdfs://127.0.0.1:842/user/doris/csv_format_test/student.csv",
    "fs.defaultFS" = "hdfs://127.0.0.1:8424",
    "hadoop.username" = "doris",
    "format" = "csv",
    "dfs.nameservices" = "my_hdfs",
    "dfs.ha.namenodes.my_hdfs" = "nn1,nn2",
    "dfs.namenode.rpc-address.my_hdfs.nn1" = "nanmenode01:8020",
    "dfs.namenode.rpc-address.my_hdfs.nn2" = "nanmenode02:8020",
    "dfs.client.failover.proxy.provider.my_hdfs" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");
      +------+---------+------+
    | c1 | c2 | c3 |
    +------+---------+------+
    | 1 | alice | 18 |
    | 2 | bob | 20 |
    | 3 | jack | 24 |
    | 4 | jackson | 19 |
    | 5 | liming | 18 |
    +------+---------+------+
  • 可以配合 desc function 使用。

    desc function hdfs(
    "uri" = "hdfs://127.0.0.1:8424/user/doris/csv_format_test/student_with_names.csv",
    "fs.defaultFS" = "hdfs://127.0.0.1:8424",
    "hadoop.username" = "doris",
    "format" = "csv_with_names");