Почему загрузка таблицы BigQuery требует корзины? - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь загрузить таблицу BigQuery в свою программу, используя Spark, Scala, но у меня возникают проблемы с пониманием роли «сегментов» в BigQuery.

Я следовал примерам на https://github.com/samelamin/spark-bigquery и https://cloud.google.com/dataproc/docs/tutorials/bigquery-connector-spark-example тем, что я изменил projectId на свой собственный и загрузил файл .json учетной записи службы для аутентификации.

Вот мой код

import com.samelamin.spark.bigquery._

class SparkSessionFunctions(val spark: SparkSession) {
def loadBQTable[T]: Unit = {
    val sqlContext = spark.sqlContext
    sqlContext.setBigQueryGcsBucket("bucketname") // What's this for?
    sqlContext.setBigQueryProjectId("data-staging-5c4d")
    sqlContext.setGcpJsonKeyFile("/key.json")
    sqlContext.hadoopConf.set("fs.gs.project.id","data-staging-5c4d")

    val df = spark.sqlContext.read.format("com.samelamin.spark.bigquery").option("tableReferenceSource","data-staging-5c4d:data_warehouse.table_to_load").load()
    println("df: " + df.select("id").collect())
    df
  }
}

Выполнение команды prinitln(df) смог показать мою схему таблицы, но я не смог собрать что-либо из самой таблицы из-за ошибки, которая говорит, что моя служебная учетная запись does not have storage.objects.get access to bucket bucketname/hadoop/tmp/bigquery/job_20190626140444_0000.

Насколько я понимаю, корзиныиспользуются только в GCS и вообще не используются в BigQuery.Так почему же обеим библиотекам нужно было указать значение корзины, чтобы оно работало?

1 Ответ

3 голосов
/ 26 июня 2019

В этом случае корзина не имеет ничего общего с BigQuery, а скорее с Google Cloud Storage.Соединитель Spark на самом деле сначала передает данные в GCS в качестве промежуточной области (следовательно, поэтому требуется корзина), а , а затем в BigQuery.

Таким образом работает ряд соединителей, поскольку вы можетепрямой запрос из CSV в облачном хранилище через так называемый внешний источник данных в BigQuery.Это позволяет обрабатывать файл в облачном хранилище как таблицу и запрашивать его с помощью вычислений BigQuery, включая возможность автоматического определения схемы, и, как правило, является более быстрым способом получения данных ELT / ETL по сравнению с более сложными интеграциями с API BigQuery.

Чтобы устранить причину ошибки, которую вы видите, вам нужно назначить своей служебной учетной записи соответствующую роль разрешения в консоли в разделе IAM & Admin (наиболее вероятно Storage Object Viewer).

Обновление: Вы также можете проверить разрешения для корзины, а также для самого объекта (файла), поскольку они могут переопределять разрешения роли IAM по умолчанию.Это можно сделать на вкладке разрешений в верхней части браузера Cloud Storage для корзины, а также в меню kabob (три точки) рядом с отдельными файлами, затем выберите параметр «Редактировать разрешения».Обратите внимание, что эти разрешения на уровне объектов на самом деле не являются частью IAM, а скорее Списки контроля доступа (ACL) - поэтому вначале они могут быть немного запутанными.

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

Как только вы преодолеете проблему с разрешениями для файла, вы можетенеобходимо добавить вызов к sqlContext.setBigQueryDatasetLocation("[your region code here]"), где код региона - это правильный Азиатско-Тихоокеанский регион из этого списка (примечание: Азиатско-Тихоокеанский регион немного отличается; большинство инструментов используют многорегиональные строки "США"или "EU", но также примут более длинные имена для одного региона.

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