amazons3—加载存储在s3中的配置单元表中的数据,其位置存储在另一个静态s3位置

zu0ti5jz  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(452)

我需要在配置单元表中加载一个s3数据。这个s3位置是动态的,存储在另一个静态s3位置中。
我想在配置单元表中加载的动态s3位置具有路径格式 s3://s3BucketName/some-path/yyyy-MM-dd 静态位置具有数据格式 {"datasetDate": "datePublished", "s3Location": "s3://s3BucketName/some-path/yyyy-MM-dd"} 有没有办法在Hive中读取这些数据?我找了很多,但什么也没找到。

ztyzrc3y

ztyzrc3y1#

您可以从静态位置文件parse中读取json数据 s3Location 字段并将其作为参数传递给add partition子句。
读取json的可能方法是使用hive。你也可以用其他方法。
使用配置单元的示例。

  1. create table data_location(location_info string)
  2. ROW FORMAT DELIMITED
  3. FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
  4. STORED AS TEXTFILE
  5. LOCATION 's3://s3BucketName/some-static-location-path/';

然后获取shell脚本中的位置,并将其作为参数传递给add partition语句。
例如,您有一个名为 target_table 分区者 datePublished . 可以这样添加分区:

  1. # !/bin/bash
  2. data_location=$(hive -e "set hive.cli.print.header=false; select get_json_object(location_info,'$.s3Location') from data_location")
  3. # get partition name
  4. partition=$(basename ${data_location})
  5. # Create partition in your target table:
  6. hive -e "ALTER TABLE TARGET_TABLE ADD IF NOT EXISTS PARTITION (datePublished='${partition}') LOCATION '${data_location}'"

如果不需要分区表,则可以使用alter table set location而不是添加分区:

  1. hive -e "ALTER TABLE TARGET_TABLE SET LOCATION='${data_location}'"

如果只有最后一个子文件夹名是动态的(即日期),并且基本目录始终相同,如s3://s3bucketname/some path/,只有yyyy-mm-dd在更改,则可以使用 location s3://s3BucketName/some-path/ 并发出recover partitions语句。在这种情况下,您不需要读取具有位置规范的文件的内容。只是时间安排 RECOVER PARTITIONS 每天安装新的隔板。

展开查看全部

相关问题