ビッグデータ = SQL Boy、SQL Debug は SQL Boy のデッドロックを突破します

ネット上ではビッグデータ=SQL少年、バックエンド開発=クソ少年、アルゴリズムエンジニア=パラメータ調整少年というのがよく噂されています。

私は数年間ビッグ データの分野で働いてきましたが、ビッグ データの開発では、SQL、Hive SQL、Spark SQL、Flink SQL などを記述するのに多くの作業が必要であることは事実です。

1. 背景:

SQL の大規模なセクションを実行した後、結果が期待したものではないことがわかりましたか? 例えば:

demo 1:
select id,name from (
select id,name from table1
union all
select id,name from table2
union all
select id,name from table3
union all
select id,name from table4
)t group by id,name

demo 2:
select a.id,a.name,a.class from (select id,name from table1 where id>=10) a left join (select name,class from table2 where name is not null)
 b on a.name=b.name;

例えば:

デモ 1 の SQL ではこのような結果データが得られます。

ID 名前
101 シャオラン
102 小兵
100 小紅

しかし、ビジネスロジック的にはidが100のデータは除外されるはずですが、実際にコードを実行した結果が予想と異なる結果が出てきました。

実際、これは C 言語開発や Java 開発と似ており、期待される結果とコードの実際の結果が一致しません。一般に、Java 開発や C 言語開発では、ログ (print、print、 log.debug) またはアイデアブレークポイントを使用する コードをデバッグし、中間結果を段階的に表示します。これはデバッグ プロセスとも呼ばれます。

では、SQL の実際の実行結果が期待と一致しないと思われるときにデバッグできるでしょうか?

2 番目に、ほとんどの人にとっての解決策は次のとおりです。

ほとんどのデータ開発者は、この問題に遭遇すると SQL を分割します。たとえば、デモ 1 の SQL は次の 4 つの SQL に分割され、各 SQL が個別に実行されて、100 の結果がどのテーブルに生成されるかを決定します。

select id,name from table1 where id='100'

select id,name from table2 where id='100'

select id,name from table3 where id='100'

select id,name from table4 where id='100'

または少し変更してください

select * from (
select id,name,flag from (
select id,name,'1' as flag from table1
union all
select id,name,'2' as flag from table2
union all
select id,name,'3' as flag from table3
union all
select id,name,'4' as flag from table4
)t group by id,name,flag )t1 where id='100'

3. 最終計画:

それでは、JavaやC言語のように中間結果をデバッグする方法、つまりアイデアデバッグやログを出力する方法はありますか?したがって、SQL デバッグのプロセスは SQL デバッグと呼ばれます。

Java または C 言語でデバッグ モードを有効にするには、ログを出力するか、アイデアと連携してデバッグする必要があります。この記事では、まず SQL デバッグ用のログを出力する方法について説明します。

(1) デバッグモードをオンにする

(2) 分割SQL

(3) 中間結果の出力

(4) 中間結果が正しいか手動で判断し、原因を究明する

(5) 最終結果が見つかるまで 2 ~ 4 のプロセスを繰り返します

例:

select u,
       max(tm),
       p1
from
  (
   select device_id as u,unix_timestamp(dt,'yyyy-MM-dd')*1000 as tm,p1
        from test.table1
        where dt='2023-04-09' and length(trim(device_id))>0
        union ALL
        select device_id as u,unix_timestamp(dt,'yyyy-MM-dd')*1000 as tm,p1
        from test.table2
        where dt='2023-04-09' and length(trim(device_id))>0	 
    union all 
     select device_id as u,unix_timestamp(dt,'yyyy-MM-dd')*1000 as tm,p1
     from test.table3
    where dt='2023-04-09' and length(trim(device_id))>0
    
  ) a
GROUP BY u,
         p1

(1) このような SQL を構文ツリーに変換し (下図を参照)、SQL の解析と分割を完了します (実際には、より複雑な SQL もすぐに分割できます)。

(2) 分割SQLからテーブルを一括作成

(3) 実際に問題を解析する際には、構築した中間テーブルのデータを直接クエリすることができます。

(4) 分析完了後、構築された中間テーブルデータは自動的に削除される必要がある

おすすめ

転載: blog.csdn.net/weixin_43291055/article/details/130061072