Ошибка при загрузке файла, хранящегося в Google Cloud Storage, в Big Query

Я пытался создать задание для загрузки сжатого файла json из Google Cloud Storage в таблицу Google BigQuery. У меня есть доступ для чтения и записи как в Google Cloud Storage, так и в Google BigQuery. Кроме того, загруженный файл принадлежит к тому же проекту, что и файл BigQuery.

Проблема возникает, когда я получаю доступ к ресурсу за этим URL-адресом https://www.googleapis.com/upload/bigquery/v2/projects/NUMERIC_ID/jobs с помощью запроса POST. С содержанием запроса к вышеуказанному ресурсу можно ознакомиться следующим образом:

{
"kind" : "bigquery#job",
"projectId" : NUMERIC_ID,
"configuration": {
    "load": {
        "sourceUris": ["gs://bucket_name/document.json.gz"],
        "schema": {
            "fields": [
                {
                    "name": "id",
                    "type": "INTEGER"
                },
                {
                    "name": "date",
                    "type": "TIMESTAMP"
                },
                {
                    "name": "user_agent",
                    "type": "STRING"
                },
                {
                    "name": "queried_key",
                    "type": "STRING"
                },
                {
                    "name": "user_country",
                    "type": "STRING"
                },
                {
                    "name": "duration",
                    "type": "INTEGER"
                },
                {
                    "name": "target",
                    "type": "STRING"
                }
            ]
        },
        "destinationTable": {
            "datasetId": "DATASET_NAME",
            "projectId": NUMERIC_ID,
            "tableId": "TABLE_ID"
        }
    }
}

}

Однако ошибка не имеет никакого смысла, и ее также можно найти ниже:

{
    "error": {
        "errors": [
            {
                "domain": "global",
                "reason": "invalid",
                "message": "Job configuration must contain exactly one job-specific configuration object (e.g., query, load, extract, spreadsheetExtract), but there were 0: "
            }
        ],
        "code": 400,
        "message": "Job configuration must contain exactly one job-specific configuration object (e.g., query, load, extract, spreadsheetExtract), but there were 0: "
    }
}

Я знаю, что проблема не в идентификаторе проекта или токене доступа, помещенном в заголовок аутентификации, потому что раньше я успешно создавал пустую таблицу. Также я указываю заголовок типа содержимого application/json, что я не думаю, что здесь проблема, потому что содержимое тела должно быть в кодировке json.

заранее спасибо


person rubioz    schedule 20.05.2014    source источник
comment
Запрос мне нравится. В конце целевого поля в схеме есть дополнительная запятая, из-за чего API может думать, что у вас 0 конфигураций заданий.   -  person Shayan Masood    schedule 20.05.2014
comment
Спасибо, но эта запятая была опечаткой, потому что в схеме было больше элементов, которые я удалил, чтобы упростить текст вопроса. Проблема все еще сохраняется.   -  person rubioz    schedule 20.05.2014


Ответы (1)


Ваш HTTP-запрос имеет неправильный формат - BigQuery вообще не распознает это как задание загрузки. Вам нужно изучить запрос POST и проверить отправленное вами тело.

Вам необходимо убедиться, что все вышеперечисленное (правильные швы) является body вызова POST. Вышеупомянутый Json должен быть на одной строке, и если вы вручную создаете составное сообщение, убедитесь, что между заголовками и телом каждого типа MIME есть дополнительная новая строка.

Если вы используете какую-то библиотеку, убедитесь, что тело не ожидается в какой-либо другой форме, такой как ресурс, контент или тело. Я видел библиотеки, которые используют их по-разному.

Попробуйте обозреватель API BigQuery: https://developers.google.com/bigquery/docs/reference/v2/jobs/insert и убедитесь, что тело вашего запроса совпадает с телом, созданным API.

person Pentium10    schedule 20.05.2014
comment
Я перешел по предоставленной ссылке и обнаружил, что это сработало. Разница в том, что они не используют конечную точку загрузки (они используют googleapis.com / bigquery / v2 / projects / NUMERIC_ID / jobs вместо googleapis.com/upload/bigquery/v2/projects/NUMERIC_ID/jobs). Кроме того, они добавляют параметр запроса key, который должен быть равен токену доступа. В этом все еще нет никакого смысла, но, по крайней мере, это работает. Спасибо - person rubioz; 20.05.2014