2017-02-12 13 views
2

私はRで処理したい100GBのテーブルを持っています。私はcsvsにエクスポートすると、500個のcsvファイルを取得します。それらは - (Rがインストールされている仮想インスタンスのメモリを増やしても)保存/ロードできない巨大なデータテーブルを取得します。私は、元のテーブルを分割し、Rにエクスポートしてから別々のテーブルを処理するという、異なる姿勢を試したかったのです。問題は、私はいくつかのグループ化の途中でスプリットを "中断"したくないということです。たとえば、私の主な変数は「訪問」であり、訪問ごとに複数の行があります。私は別のサブテーブルに分割された訪問があることを望んでいません(Rでのすべての処理は、訪問をデータテーブルのグループ化変数として使用して行われます)。それをする最善の方法は何ですか?訪問IDを時間順に注文し、名前のみをspearate CSVなどにエクスポートしようとしました。試行ごとのすべての注文はエラーで終了します(リソースが不足しています)。テーブルには現在、100M以上の行と、64個の変数が含まれています。BigQueryでcsvにエクスポートし、巨大なテーブルでRをロード

+0

を使用している場合、私はすぐにレガシーSQLでそれを書いて実現するので、以下の場合は、標準SQLでのバージョンはどのようにデータGROを団子について賢明? –

+0

@RomanLuštrik正確に何を意味するのかよく分かりません。私はグループでどうすればいいですか? – user3017075

+0

ミハイルの答えを見て、それは私が意味するものです。 :) –

答えて

1

私は違う態度を試してみたかった - 元のテーブルを分割...
問題は、私は、分割は、いくつかのグループ化の途中で「壊す」したいdin'tということです。以下は

あなたは、その後の間、これらのvisitidsのための行のみを抽出するためにそれらを使用できるように識別されている方法と同じVISITIDの行は、各バッチの最大値と最小VISITIDについて同じバッチ
になることを、このようなバッチを特定することです最小値と最大値、あなたの処理するデータのため制御サイズ

から
は、あなたが行

の数であることをバッチサイズを好きで、以下の1000000を交換した行の数によって バッチ処理
#legacySQL 
SELECT 
    batch, 
    SUM(size) AS size, 
    COUNT(visitId) AS visitids_count, 
    MIN(visitId) AS visitId_min, 
    MAX(visitId) AS visitId_max 
FROM (
    SELECT 
    visitId, 
    size, 
    INTEGER(CEIL(total/1000000)) AS batch 
    FROM (
    SELECT 
     visitId, 
     size, 
     SUM(size) OVER(ORDER BY visitId) AS total 
    FROM (
     SELECT visitId, COUNT(1) AS size 
     FROM [yourproject:yourdataset.yourtable] 
     GROUP BY visitId 
    ) 
) 
) 
GROUP BY batch 

- バッチ
のバイトサイズによってバッチ処理を使用すると、バッチサイズがバイト
の面でも1行のeastimated平均サイズで123以下を交換したいものは何でもして、以下の1000000000を交換してくださいバイト単位で

以上は、バッチの最小値と最大値を使用して元のテーブルを分割するのに役立ちますバッチが合理的に均等に

を大きさになりますので、上記VISITIDと(あなたの例のように)テーブルの行の比較的大きな数の行の正規分布を仮定し、このヘルプあなたはさらに

注意を続行する ・ホープ

注2:あなたがmigrateしたいか、すでにそれを

#standardSQL 
SELECT 
    batch, 
    SUM(size) AS size, 
    COUNT(visitId) AS visitids_count, 
    MIN(visitId) AS visitId_min, 
    MAX(visitId) AS visitId_max 
FROM (
    SELECT 
    visitId, 
    size, 
    CAST(CEIL(total/1000000) as INT64) AS batch 
    FROM (
    SELECT 
     visitId, 
     size, 
     SUM(size) OVER(ORDER BY visitId) AS total 
    FROM (
     SELECT visitId, COUNT(1) AS size 
     FROM `yourproject.yourdataset.yourtable` 
     GROUP BY visitId 
    ) 
) 
) 
GROUP BY batch 
+0

ありがとうございます!これは完璧です! – user3017075

関連する問題