访问OSS数据

Lindorm计算引擎提供完善的Hive数仓能力,支持与对象存储OSS之间的导入导出功能,方便进行跨数仓文件管理。本文介绍如何使用计算引擎与OSS间的数据导入导出功能。

前提条件

操作步骤

连接计算引擎

  1. 使用Beeline访问计算引擎。连接时,需额外在conf/beeline.conf中添加以下配置项:

    # your oss accessKeyId
    spark.hadoop.fs.oss.accessKeyId=LTAI5tA*********
    # your oss accessKeySecret
    spark.hadoop.fs.oss.accessKeySecret=pNrAHzJ4hEQ******
    # your oss endpoint
    spark.hadoop.fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com 
    spark.hadoop.fs.oss.impl=org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem 
    spark.hadoop.fs.oss.list.version=1
    kyuubi.engine.share.level=CONNECTION

    配置项

    说明

    spark.hadoop.fs.oss.endpoint

    OSSEndpoint

    spark.hadoop.fs.oss.accessKeyId

    阿里云账号或RAM用户的AccessKey ID

    spark.hadoop.fs.oss.accessKeySecret

    阿里云账号或RAM用户的AccessKey Secret

    spark.hadoop.fs.oss.impl

    访问OSS的类。

    固定值为:org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem

  2. Spark作业中添加配置项spark.sql.warehouse.dir,指定Hive表存储的OSS路径。例如oss://<YourBucketName>/ldps_warehouse

    说明

    您也可以在创建namespace或者table时,通过LOCATION关键字指定该namespace或者table的存储路径。例如CREATE TABLE testTbl(id LONG) LOCATION "oss://<YourBucketName>/tbl_dir"使用该方式配置的路径会覆盖spark.sql.warehouse.dir配置项指定的路径。

访问Hive表数据

访问方式:访问Hive数据

Hive数据导入OSS

您可以通过以下操作步骤,将Lindorm中的Hive数据,转化为CSV格式并存储至OSS中。

  1. 在计算引擎中创建表,指定使用CSV格式存储数据,并指定表的OSS存储路径。

    CREATE TABLE my_table (
      id BIGINT,
      data STRING,
      company STRING)
    USING CSV
    partitioned by (company)
    LOCATION 'oss://<YourBucketName>/path/to/store/data/';
  2. 写入数据。

    INSERT INTO my_table 
      SELECT 1, "my_data0", "ALIBABA"
      UNION ALL
      SELECT 1, "my_data1", "BYD";

    通过上述语句,可以将数据同时写入计算引擎和OSS路径oss://<YourBucketName>/path/to/store/data/。由于指定的数据分区为company字段,因此在OSS中, 数据将按照company字段进行分区,存储在不同目录中。如下所示:image

    您也可以查询不同的源表并写入OSS,例如查询宽表数据:

    INSERT INTO my_table 
      SELECT id, data, company FROM lindorm_table.my_lindorm_db.my_lindorm_table;

OSS中的Hive数据导入计算引擎

假设OSS中的CSV文件的数据如下:

{"data_type":"document","version":"1.0","source":"cc","id":"sha1:223CN5DQHLZFTLCK45RGXKFIVEHU****","data":[{"meta":{"url":"http://www.publicdomainpictures.net/view-image.php?image=1446&picture=&jazyk=CN","date_download":"2017-05-22T21:56:02Z","source_domain":"www.publicdomainpictures.net","bucket":"head","title":"烟花 免费图片 - Public Domain Pictures","language":"zh","language_score":0.75,"perplexity":1073.4},"text":"烟花 高级下载\n1280 x 853 px, ▼ 3,341 次烟花,"}]}
  1. 创建OSS外表。

    CREATE TABLE raw_json_data (
      data_type STRING,
      version STRING,
      source STRING,
      id STRING,
      data ARRAY<STRUCT<
        meta: STRUCT<
          url: STRING,
          date_download: STRING,
          source_domain: STRING,
          bucket: STRING,
          title: STRING,
          language: STRING,
          language_score: DOUBLE,
          perplexity: DOUBLE
        >,
        text: STRING
      >>
    )
    USING JSON
    LOCATION 'oss://<YourBucketName>/tbl_dir/';
  2. 创建结果表(列存表)data_clean,用于保存从OSS导入的数据。

    CREATE TABLE data_clean (
        id STRING,
        title STRING,
        data_type STRING,
        url STRING,
        content STRING,
        source STRING,
        publish_time TIMESTAMP,
        create_time TIMESTAMP,
        query STRING,
        snippet STRING,
        language STRING
    );
  3. OSS外表中的部分列写入结果表data_clean

    INSERT INTO data_clean
    SELECT
      uuid() AS id,
      data[0].meta.title AS title,
      data_type AS data_type,
      data[0].meta.url AS url,
      data[0].text AS content,
      source AS source,
      CURRENT_TIMESTAMP AS publish_time,
      CURRENT_TIMESTAMP AS create_time,
      "query",
      "snippet",
      data[0].meta.language AS language
    FROM raw_json_data;
  4. (可选)您可以通过SELECT语句查询数据是否成功导入计算引擎。

    SELECT * FROM data_clean;