選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

在 DynamoDB 和 之間複製資料 HDFS

焦點模式
在 DynamoDB 和 之間複製資料 HDFS - Amazon DynamoDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

如果您在 DynamoDB 資料表中有資料,您可以使用 Hive 將資料複製到 Hadoop 分散式檔案系統 (HDFS)。

如果您正在執行需要來自 DynamoDB 資料 MapReduce 的任務,則可以執行此操作。如果您將資料從 DynamoDB 複製到 HDFS,Hadoop 可以使用 Amazon EMR叢集中的所有可用節點並行處理。當 MapReduce 任務完成時,您可以將結果從 寫入 HDFS DDB。

在下列範例中,Hive 將從下列HDFS目錄讀取和寫入: /user/hadoop/hive-test

注意

本節中的範例假設您會遵循 教學課程:使用 Amazon DynamoDB 和 Apache Hive 中的步驟,並且在 DynamoDB 中有一個名為 ddb_features 的外部資料表。

使用 Hive 預設格式複製資料

範例 從 DynamoDB 到 HDFS

使用 INSERT OVERWRITE陳述式直接寫入 HDFS。

INSERT OVERWRITE DIRECTORY 'hdfs:///user/hadoop/hive-test' SELECT * FROM ddb_features;

中的資料檔案HDFS如下所示:

920709^ASoldiers Farewell Hill^ASummit^ANM^A32.3564729^A-108.33004616135 1178153^AJones Run^AStream^APA^A41.2120086^A-79.25920781260 253838^ASentinel Dome^ASummit^ACA^A37.7229821^A-119.584338133 264054^ANeversweet Gulch^AValley^ACA^A41.6565269^A-122.83614322900 115905^AChacaloochee Bay^ABay^AAL^A30.6979676^A-87.97388530

每個欄位以SOH字元 (標題開頭,0x01) 分隔。在 檔案中, SOH顯示為 ^A

範例 從 HDFS到 DynamoDB
  1. 建立外部資料表,以映射至 中的未格式化資料HDFS。

    CREATE EXTERNAL TABLE hdfs_features_unformatted (feature_id BIGINT, feature_name STRING , feature_class STRING , state_alpha STRING, prim_lat_dec DOUBLE , prim_long_dec DOUBLE , elev_in_ft BIGINT) LOCATION 'hdfs:///user/hadoop/hive-test';
  2. 將資料複製到 DynamoDB。

    INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_unformatted;

以使用者指定格式複製資料

如果您想要使用不同的欄位分隔符號字元,您可以建立對應至HDFS目錄的外部資料表。您可以使用此技術建立以逗號分隔值 () 的資料檔案CSV。

範例 從 DynamoDB 到 HDFS
  1. 建立映射到 的 Hive 外部資料表HDFS。執行此操作時,請確定資料類型與 DynamoDB 外部資料表的資料類型一致。

    CREATE EXTERNAL TABLE hdfs_features_csv (feature_id BIGINT, feature_name STRING , feature_class STRING , state_alpha STRING, prim_lat_dec DOUBLE , prim_long_dec DOUBLE , elev_in_ft BIGINT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 'hdfs:///user/hadoop/hive-test';
  2. 從 DynamoDB 複製資料。

    INSERT OVERWRITE TABLE hdfs_features_csv SELECT * FROM ddb_features;

中的資料檔案HDFS如下所示:

920709,Soldiers Farewell Hill,Summit,NM,32.3564729,-108.3300461,6135 1178153,Jones Run,Stream,PA,41.2120086,-79.2592078,1260 253838,Sentinel Dome,Summit,CA,37.7229821,-119.58433,8133 264054,Neversweet Gulch,Valley,CA,41.6565269,-122.8361432,2900 115905,Chacaloochee Bay,Bay,AL,30.6979676,-87.9738853,0
範例 從 HDFS到 DynamoDB

使用單一 HiveQL 陳述式,您可以使用來自 的資料填入 DynamoDB 資料表HDFS:

INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_csv;

在無資料欄映射的情況下複製資料

您可以從 DynamoDB 以原始格式複製資料,並寫入 ,HDFS而無需指定任何資料類型或資料欄映射。您可以使用此方法建立 DynamoDB 資料的封存,並將其存放在 中HDFS。

注意

如果您的 DynamoDB 資料表包含 Map、List、Boolean 或 Null 類型的屬性,則這是您可以使用 Hive 將資料從 DynamoDB 複製到 的唯一方法HDFS。

範例 從 DynamoDB 到 HDFS
  1. 建立與 DynamoDB 資料表相關聯的外部資料表。(此 HiveQL 陳述式中沒有 dynamodb.column.mapping。)

    CREATE EXTERNAL TABLE ddb_features_no_mapping (item MAP<STRING, STRING>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Features");

  2. 建立另一個與您的HDFS目錄相關聯的外部資料表。

    CREATE EXTERNAL TABLE hdfs_features_no_mapping (item MAP<STRING, STRING>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 'hdfs:///user/hadoop/hive-test';
  3. 將資料從 DynamoDB 複製到 HDFS。

    INSERT OVERWRITE TABLE hdfs_features_no_mapping SELECT * FROM ddb_features_no_mapping;

中的資料檔案HDFS如下所示:

Name^C{"s":"Soldiers Farewell Hill"}^BState^C{"s":"NM"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"6135"}^BLatitude^C{"n":"32.3564729"}^BId^C{"n":"920709"}^BLongitude^C{"n":"-108.3300461"} Name^C{"s":"Jones Run"}^BState^C{"s":"PA"}^BClass^C{"s":"Stream"}^BElevation^C{"n":"1260"}^BLatitude^C{"n":"41.2120086"}^BId^C{"n":"1178153"}^BLongitude^C{"n":"-79.2592078"} Name^C{"s":"Sentinel Dome"}^BState^C{"s":"CA"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"8133"}^BLatitude^C{"n":"37.7229821"}^BId^C{"n":"253838"}^BLongitude^C{"n":"-119.58433"} Name^C{"s":"Neversweet Gulch"}^BState^C{"s":"CA"}^BClass^C{"s":"Valley"}^BElevation^C{"n":"2900"}^BLatitude^C{"n":"41.6565269"}^BId^C{"n":"264054"}^BLongitude^C{"n":"-122.8361432"} Name^C{"s":"Chacaloochee Bay"}^BState^C{"s":"AL"}^BClass^C{"s":"Bay"}^BElevation^C{"n":"0"}^BLatitude^C{"n":"30.6979676"}^BId^C{"n":"115905"}^BLongitude^C{"n":"-87.9738853"}

每個欄位都以STX字元 (文字開頭,0x02) 開頭,並以ETX字元 (文字結尾,0x03) 結尾。在 檔案中, STX 顯示為 ^B,而 ETX 顯示為 ^C

範例 從 HDFS到 DynamoDB

使用單一 HiveQL 陳述式,您可以使用來自 的資料填入 DynamoDB 資料表HDFS:

INSERT OVERWRITE TABLE ddb_features_no_mapping SELECT * FROM hdfs_features_no_mapping;

在 中存取資料 HDFS

HDFS 是一種分散式檔案系統,可供 Amazon EMR叢集中的所有節點存取。如果您使用 SSH 連線到領導節點,您可以使用命令列工具來存取 Hive 寫入 的資料HDFS。

HDFS 與領導節點上的本機檔案系統不同。您無法HDFS在 中使用使用標準 Linux 命令 (例如 catmvcp或 ) 的檔案和目錄rm。這些任務要使用 hadoop fs 命令來執行。

下列步驟會編寫,並假設您已HDFS使用本節中的其中一個程序,將資料從 DynamoDB 複製到 。

  1. 如果您目前處於 Hive 命令提示字元,請離開至 Linux 命令提示字元。

    hive> exit;
  2. 在 中列出 the /user/hadoop/hive-test 目錄的內容HDFS。(這是 Hive 從 DynamoDB 複製資料的位置。)

    hadoop fs -ls /user/hadoop/hive-test

    回應外觀會與下列類似:

    Found 1 items -rw-r--r-- 1 hadoop hadoop 29504 2016-06-08 23:40 /user/hadoop/hive-test/000000_0

    檔案名稱 (000000_0) 是由系統產生的。

  3. 檢視檔案的內容:

    hadoop fs -cat /user/hadoop/hive-test/000000_0
    注意

    在此範例中,檔案相對較小 (大約 29 KB)。請審慎對非常大或包含不可列印字元的檔案使用此命令。

  4. (選用) 您可以將資料檔案從 複製到領導節點HDFS上的本機檔案系統。執行此操作之後,您可以使用標準 Linux 命令列公用程式來使用檔案中的資料。

    hadoop fs -get /user/hadoop/hive-test/000000_0

    此命令不會覆寫檔案。

    注意

    領導節點上的本機檔案系統容量有限。請勿將此命令與大於本機檔案系統中可用空間的檔案搭配使用。

隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。