bigQuery Google Drive запрашивает несколько листов с диапазоном googleSheetsOptions - PullRequest
0 голосов
/ 31 мая 2018

Я создал электронную таблицу Google Sheets с двумя таблицами, которые называются Sheet1 и Sheet2:

https://docs.google.com/spreadsheets/d/1P1WH7cwVDaG6k-OQxKVXtnjBXI1NGFYvHD6IxCRFsZc/edit?usp=sharing

Sheet1, имеет столбцы col1 и col2в строке 1, а Sheet2 имеет столбцы col3 и col4 в строке 1.

Я хотел бы иметь возможность запрашивать оба листа, используя интерфейс командной строки bigQuery.Кажется, что это было невозможно до недавнего добавления новой функции в мае 2018 года:

https://issuetracker.google.com/issues/35905674#comment12

Я пытался воспроизвести то, что описывает этот комментарий, но не могу заставить его работать.Вот что я сделал до сих пор:

Описание новой функции показывает пример google_sheets_tabeledef.json, который выглядит следующим образом:

{
  "autodetect": false,
  "sourceFormat": "GOOGLE_SHEETS", 
  "sourceUris": [
    "https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxx"
  ],
  "maxBadRecords": 1,
  "googleSheetsOptions":
  {
    "range": "test_sheet!A1:B20",
    "skipLeadingRows": 0
  },
  "schema" : {
    "fields": [
      {
        "name": "col1",
        "type": "string"
      },
      {
        "name": "col2",
        "type": "int64"
      },
    ]
  }
}

Учитывая мою электронную таблицу с двумя листами, Sheet1 и Sheet2, я создал соответствующие таблицы в моей учетной записи bigQuery, затем попытался запросить каждую из них через командную строку bq query.Это работает, как показано для Sheet1:

bq query --format=csv --use_legacy_sql=false 'SELECT * FROM `cegx-test-project1.multi_sheet_test.Sheet1`' 2>/dev/null

col1,col2
col1,col2
foo,bar
abc,def

И если я попробую то же самое для Sheet2, в отсутствие external_table_definition, он показывает:

bq query --format=csv --use_legacy_sql=false 'SELECT * FROM `cegx-test-project1.multi_sheet_test.Sheet2`' 2>/dev/null

col3,col4
col1,col2
foo,bar
abc,def

Так что это в основномвозвращается к первому рабочему листу вместо запроса Sheet2.Итак, как и ожидалось.

Затем я создал эквивалентный google_sheets_sheet2_tabledef.json файл, подобный следующему:

{
  "autodetect": true, 
  "sourceFormat": "GOOGLE_SHEETS", 
  "sourceUris": [
    "https://docs.google.com/spreadsheets/d/1P1WH7cwVDaG6k-OQxKVXtnjBXI1NGFYvHD6IxCRFsZc"
  ],
  "maxBadRecords": 1,
  "googleSheetsOptions":
  {
    "range": "Sheet2!A1:B10",
    "skipLeadingRows": 0
  },
  "schema" : {
    "fields": [
{"name":"col3","type":"string"},
{"name":"col4","type":"string"}
    ]
  }
}

Обратите внимание, что в параметре range я указываю на Sheet2!A1:B10.

Если я попытаюсь снова запросить таблицу, теперь с флагом external_table_definition я получу:

bq query --external_table_definition="Sheet2::/tmp/google_sheets_sheet2_tabledef.json" --format=csv --use_legacy_sql=false 'SELECT * FROM `cegx-test-project1.multi_sheet_test.Sheet2`' 2>/dev/null                                             

col3,col4
col1,col2
foo,bar
abc,def

Так что я все равно получаю результаты из Sheet1 даже с внешним файлом определенияуказывая на диапазон в Sheet2.

Есть идеи, где проблема?

1 Ответ

0 голосов
/ 31 мая 2018

Похоже, что команда, которую вы использовали для запроса из определения временной внешней таблицы, не ссылалась на внешнюю таблицу.

Если вы измените команду на следующую, она должна работать как положено:

bq query --external_table_definition = "Sheet2 :: / tmp / google_sheets_sheet2_tabledef.json" --format = csv --use_legacy_sql = false 'SELECT * FROM Sheet2' 2> / dev / null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...