2017-10-04 194 views
0

在以下簡單示例中,'foo.csv'是一個簡單的3列表。 第一列是行號。第二和第三列是字符串。排序順序table.getRows

我使用模式自動檢測創建表。 (我也嘗試創建一個具有類似結果的特定模式表。) 然後,我使用table.getRows來查詢它。 返回的行不是按照它們插入的順序。 我花了一段時間才弄清楚順序,因爲它不是第一列的插入順序或數字順序。

排序順序是 - 第二列 的長度 - 按字母順序由第二列 - 第三列 的長度 - 按字母順序由第三列

這是完全無用的,據我很擔心。 我怎樣才能A)保留插入順序或B)按第一列排序? 這似乎是一個相對直接的請求,但我找不到任何文檔。

const gcloud = require('google-cloud'); 
const storage = gcloud.storage(); 
const bigquery = gcloud.bigquery({ projectId: projectId }); 
const async = require('async'); 

const bucket = storage.bucket(storage.bucket); 
const file = bucket.file('foo.csv'); 

const dataset = bigquery.dataset('dataset1'); 
const table = dataset.table('table1'); 

async.waterfall([ 
    (callback) => { 
      table.import(file, { 
        autodetect: true, 
        maxBadRecords: 500000, 
        writeDisposition: 'WRITE_TRUNCATE', 
      }, callback); 
    }, 
    (job, apiResponse, callback) => { 
      async.retry({ 
        times: 20000, 
        interval: 2000 
      }, (retryCallback, results) => { 
        job.getMetadata((err, metadata) => { 
         let status = metadata.status.state; 
         retryCallback((status == 'DONE') ? null : status); 
        }); 
      }, callback); 
    }, 
    (callback) => { 
      table.getRows({ 
        autoPaginate: false, 
        maxResults: 100 
      }, callback); 
    }, 
    (rows, nextQuery, info, callback) => { 
      rows.forEach((row) => { 
        console.log(JSON.stringify(row)); 
      }); 
      callback(null); 
    } 
], (err) => { 
    console.log(err); 
}); 

回答

1

而不是使用table.getRows可以使用table.query傳遞中,你可以用一個Order By子句指定排序的SQL查詢。

https://googlecloudplatform.github.io/google-cloud-node/#/docs/bigquery/0.3.0/bigquery/table?method=query

+0

這樣的作品,它解決了我的眼前的問題。但是,有沒有辦法保持插入的順序,以涵蓋我沒有可以分類的列的情況? –

+0

我不知道有什麼方法,在幕後BigQuery使用列和組織數據以使查詢有效。您可以添加插入時間列,但您可能必須手動解析csv文件並添加此信息。 –