4

Redshift/MySql に相当するものに変換する必要がある Hive テーブルに遭遇しました。Hive クエリ構造を理解するのに苦労しています。助けていただければ幸いです。

CREATE TABLE IF NOT EXISTS table_1 (
    id BIGINT,
    price DOUBLE,
    asset string
)
PARTITIONED BY (
    pt STRING
);
ALTER TABLE table_1 DROP IF EXISTS PARTITION (pt== '${yyyymmdd}');

INSERT OVERWRITE TABLE table_1 PARTITION (pt= '${yyyymmdd}') 
select aa.id,aa.price,aa.symbol from
...
...
from
 table_2 table 

PARTITIONED BY 句を理解できません。私の理解が正しければ、これは MySQL テーブル パーティションとは異なり、Hive 固有の動的パーティションです。パーティションは列またはキーを定義せず、現在の日付でパーティション化します。

これは、table_1 が日付で分割されていることを意味しますか? 毎日別のパーティションがありますか。

その後、コードの後半には、次のような表記があります

inner join table_new table on table.pt = '${yyyymmdd}' and ...

このコンテキストでは、挿入された行だけyyyymmddが結合のために選択されるということですか?

ありがとうございました。

4

2 に答える 2

2

Hive のパーティションは、デフォルトで HDFS のフォルダーでありkey=value、Hive メタストアに名前 + メタデータがあります。パーティションの場所を変更し、任意のフォルダーの上にパーティションを作成できます。

これは、日付ではなくstringPARTITIONED BY (pt STRING)型のパーティション列 pt を定義します。パーティション値はメタデータに格納されます。pt 列はテーブル データ ファイルには存在せず、PARTITIONED BY でのみ定義され、すべてのパーティション値はメタデータに格納されます。パーティションを動的にロードすると、pt='value' という名前のパーティション フォルダーが作成されます。

次の文はパーティションを動的に作成します。

INSERT OVERWRITE TABLE table_1 PARTITION (pt) 
select id, price, symbol
       coln as pt            --partition column should be the last one
  from ...

そして、この文は単一の STATIC パーティションをロードします:

INSERT OVERWRITE TABLE table_1 PARTITION (pt= '${yyyymmdd}') 
select aa.id,aa.price,aa.symbol 
  from

パーティション列が選択されていません。

PARTITION  (pt= '${yyyymmdd}')

'${yyyymmdd}'これは、次のようyyyymmddに使用してスクリプトに渡される名前のパラメーターです。--hivevar

 hive --hivevar yyyymmdd=20200604 -f myscript.sql 

この場合、パーティション値として任意の文字列を渡すことができますが、パラメーター名 yyyymmdd はその形式を示唆しています。

ところで、ハイブの日付形式は'yyyy-MM-dd'文字列形式であり、'yyyy-MM-dd'暗黙的にDATEに変換できます。

于 2020-06-04T07:30:19.713 に答える