web-dev-qa-db-ja.com

BigQueryテーブルから重複行を削除する

100万行以上のデータと20列以上のテーブルがあります。

テーブル(tableX)内で、特定の1つの列(troubleColumn)で重複レコード(〜80k)を識別しました。

可能であれば、元のテーブル名を保持し、問題のある列から重複レコードを削除します。そうしないと、同じスキーマで重複のない新しいテーブル(tableXfinal)を作成できます。

私はSQLやその他のプログラミング言語に不慣れなので、無知を許してください。

delete from Accidents.CleanedFilledCombined 
where Fixed_Accident_Index 
in(select Fixed_Accident_Index from Accidents.CleanedFilledCombined 
group by Fixed_Accident_Index 
having count(Fixed_Accident_Index) >1);
27
TheGoat

テーブルを書き換えるクエリを実行して、重複を削除できます(宛先と同じテーブルを使用するか、新しいテーブルを作成し、必要なものがあることを確認してから、古いテーブルにコピーします)。

動作するはずのクエリは次のとおりです。

SELECT *
FROM (
  SELECT
      *,
      ROW_NUMBER()
          OVER (PARTITION BY Fixed_Accident_Index)
          row_number
  FROM Accidents.CleanedFilledCombined
)
WHERE row_number = 1
38
Jordan Tigani

UPDATE 2019:MERGEを使用して単一パーティションの行の重複を排除するには、以下を参照してください。


ジョーダンの答えに代わるもの-これはあまりにも多くの複製を持っているときにスケーリングします:

#standardSQL
SELECT event.* FROM (
  SELECT ARRAY_AGG(
    t ORDER BY t.created_at DESC LIMIT 1
  )[OFFSET(0)]  event
  FROM `githubarchive.month.201706` t 
  # GROUP BY the id you are de-duplicating by
  GROUP BY actor.id
)

または、より短いバージョン(最新のものではなく、任意の行を使用):

SELECT k.*
FROM (
  SELECT ARRAY_AGG(x LIMIT 1)[OFFSET(0)] k 
  FROM `fh-bigquery.reddit_comments.2017_01` x 
  GROUP BY id
)

既存のテーブルの行を重複排除するには:

CREATE OR REPLACE TABLE `deleting.deduplicating_table`
AS
# SELECT id FROM UNNEST([1,1,1,2,2]) id
SELECT k.*
FROM (
  SELECT ARRAY_AGG(row LIMIT 1)[OFFSET(0)] k 
  FROM `deleting.deduplicating_table` row
  GROUP BY id
)
22
Felipe Hoffa

誰もDISTINCTクエリに言及していない理由がわかりません。

重複する行を削除する方法は次のとおりです。

CREATE OR REPLACE TABLE project.dataset.table
AS
SELECT DISTINCT * FROM project.dataset.table
8
Semra

スキーマにレコードがない場合-ジョーダンの回答のvariation以下は、同じテーブルまたは新しいテーブルに書き込むなどで十分に機能します。

SELECT <list of original fields>
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY Fixed_Accident_Index) AS pos,
  FROM Accidents.CleanedFilledCombined
)
WHERE pos = 1

より一般的な場合-レコード/ネット化フィールドなどの複雑なスキーマを使用する場合-上記のアプローチは課題になる可能性があります。

Tabledata:insertAll APIを rows []。insertId 各行のそれぞれのFixed_Accident_Indexに設定して使用することをお勧めします。この場合、重複した行はBigQueryによって削除されます

もちろん、これにはクライアント側のコーディングが含まれるので、この特定の質問には関係ないかもしれません。私はこのアプローチを自分で試したことはありませんが、試してみると面白いかもしれません:o)

1