1

hdp 3.1.0 から 3.1.4 にアップグレードしてから、Hive で理解できない問題が発生しました。ここでは ORC トランザクション テーブルのみを使用していることに注意してください。

たとえば、次のクエリ:

with cte as (
  select
      e.id
    , '{}' as json
  from event e
)
-- select count(*) from cte
select 
    id
  , lv.customfield
from cte
lateral view outer
  json_tuple(cte.json, 'customfield') cv AS `customfield`

アップグレード前は完全に機能していました。

ここで、CTE が特定の行数を返したとしても、ラテラル ビューを使用すると、エラーなしで結果セットから行が削除されますが、CTE の外側に余分な where 句はありません (私の実際の例では、クエリは 66 行を返します)。側面図はありませんが、19 のみあります)。

私の場合、私は持っています:

  • select count(*)66行ください
  • 静的文字列の側面図を追加すると、19 行しか表示されません。

私はかなりの数のバリエーションを試しました:

  • イベント テーブルを静的 CTE ( ) に置き換えると、select stack(1, ...)期待どおりの結果が得られます
  • 横方向のビューを削除すると、期待する行数が得られます (使用しない限り、とは異なります)
  • CTE の代わりに一時テーブルを作成して使用しても、結果は変わりません。
  • CTEの外側に選択部分を配置json_tuple(cte.json, 'customfield')した場合(有効ではないため、他には何もありません)、 なしではlateral view、期待される行数があります。
  • get_json_objectCTEの外側の選択部分で使用すると(側面図はありません)、期待される結果が得られます。
  • もちろん、ハイブ (サーバーまたはメタストア) のログには何もありません。
  • 補足として、merge以前は完全に機能していたのに対し、アップグレード a ステートメント [重複を生成し続ける] [1] 以来。

もう 1 つの非常に驚くべきことは、CTE 内に if ステートメントがあることですif(is_deleted is null, 'true', 'false')。完全に有効なはずの を に置き換えるis nullと、CTE から行が返されません。is not distinct from null

私は完全に途方に暮れており、なぜこれが起こるのか、どうすればハイブを信頼できるのかわかりません. 

手動データを生成してもエラーを再現できないため、実際に機能する (ない) 例を示すことはできません。

4

1 に答える 1

0

実際の理由はまだわかりませんが、問題を切り分けることができ、実際にバグ レポートを送信できました: https://issues.apache.org/jira/browse/HIVE-22500

つまり、並べ替え (暗黙的または明示的) が関係している場合、タイムスタンプへの暗黙的な文字列変換を伴う以下は失敗します。

-- valid result
select count(*) from ( select * from opens where load_ts <= '2019-11-13 09:07:00') t;
-- invalid result
select count(*) from ( select * from opens where load_ts <= '2019-11-13 09:07:00' sort by id) t;

完全なセットアップやその他の例については、バグ レポートを参照してください。回避策は、文字列を明示的にタイムスタンプにキャストすることです。

于 2019-11-18T19:14:41.503 に答える