3

Hive のデータを転置できますか? のように、行が列になり、列が行になりますか? まっすぐに機能がない場合、いくつかのステップでそれを行う方法はありますか?

次のようなテーブルがあります。

 | ID   |   Names   |  Proc1   |   Proc2 |  Proc3  |
 | 1    |    A1     |   x      |   b     |  f      |
 | 2    |    B1     |   y      |   c     |  g      |
 | 3    |    C1     |   z      |   d     |  h      |
 | 4    |    D1     |   a      |   e     |  i      |

私はそれが次のようになりたい:

 | A1   |   B1   |  C1   |   D1 |  
 | x    |    y   |   z   |   a  |
 | b    |    c   |   d   |   e  |
 | f    |    g   |   h   |   i  |

私は他の関連する質問を調べてきましたが、それらはすべて横方向のビューと分解の使用について言及していますが、横方向(ly)のビュー(ing)と爆発(ing)の列を選択的に選択する方法はありますか?

また、私がやりたいことを達成するための大まかなプロセスは何ですか? 私を助けてください。ありがとう!

編集:私はこのリンクを読んでいます: https://cwiki.apache.org/Hive/languagemanual-lateralview.htmlそして、私が達成したいことの半分を示しています。リンクの最初の例は、行を繰り返して列名として使用したくないことを除いて、基本的に私が望むものです。explodeを実行すると、目的の出力が得られるような形式にデータを取得する方法、またはその逆の方法、つまり、explode最初に別のステップに進み、次に目的の出力テーブルにつながる方法に関するアイデア。再度、感謝します!

4

2 に答える 2

3

これを行うためのハイブのボックスからの方法はわかりません。申し訳ありません。爆発などで近づきますが、仕事を成し遂げることはできないと思います。

全体として、概念的には、変換先テーブルの列がどのようなものになるかを事前に知らずに転置するのは難しいと思います。これは、特にハイブの場合に当てはまります。メタデータは、データベース (メタストア) 内の列の数、その型、名前などに関連しているためです。そして、それは一般的に真実です。なぜなら、列を事前に知らないと、ある種のデータのメモリ内保持が必要になり(確かにスピルがあります)、ユーザーはメモリなどをオーバーフローしないように注意する必要があるかもしれません(動的のように)ハイブでのパーティショニング)。

いずれにせよ、簡単に言えば、目的のテーブルの列を事前に知っていれば、問題はありません。私の知る限り、ハイブ自体には set コマンドはありませんが、一連の if 句と case ステートメントを使用できます (醜いことは知っていますが、過去に同じことをした方法です)。 select 句を使用してデータを転置します。SQLの行に沿った何か - 転置する方法は?

それがどうなるか教えてください!

于 2013-09-10T04:05:12.967 に答える
1

Mark が指摘したように、PIVOTは Hive に存在しないため、Hive でこれを行う簡単な方法はなく、複数の値 (proc1、proc2、proc3) があるため、case/when 'trick' を使用しようとすると問題が発生する可能性もあります。 .

テスト目的で、別のアプローチを試すことができます。

select v, o1, o2, o3 from (
  select k, 
         v,
         LEAD(v,3) OVER() as o1,
         LEAD(v,6) OVER() as o2,
         LEAD(v,9) OVER() as o3
  from (select transform(name,proc1,proc2,proc3) using 'python strm.py' AS (k, v) 
    from input_table) q1
) q2 where k = 'A1';

ここでstrm.py :

import sys

for line in sys.stdin:
  line = line.strip()
  name, proc1, proc2, proc3 = line.split('\t')
  print '%s\t%s' % (name, proc1)
  print '%s\t%s' % (name, proc2)
  print '%s\t%s' % (name, proc3)

ここでの秘訣は、行の各列を個別の行として出力する map フェーズで Python スクリプトを使用することです。次に、3 つおきに (3 つの proc 列があるため) 行が結果の行を形成します。

ただし、このクエリは機能しますが、入力が大きくなると、クエリの次の 3 番目の要素を覗く必要があり、パフォーマンスが低下する可能性があるという欠点があります。とにかく、テスト目的で評価することができます。

于 2013-09-11T14:23:44.553 に答える