Я использую официальный соединитель Google Spark-BigQuery (com.google.cloud.bigdataoss:bigquery-connector:hadoop2-0.13.6
) для извлечения данных из BigQuery в огромную таблицу с временным разделением (поле myDateField
).
Итак, в настоящее время я делаю это (пример, адаптированный из документов) для получения последних данных (менее чем за месяц):
val config = sparkSession.sparkContext.hadoopConfiguration
config.set(BigQueryConfiguration.GCS_BUCKET_KEY, "mybucket")
val fullyQualifiedInputTableId = "project:dataset.table"
BigQueryConfiguration.configureBigQueryInput(config, fullyQualifiedInputTableId)
val bigQueryRDD: RDD[(LongWritable, JsonObject)] = sparkSession.sparkContext.newAPIHadoopRDD(
config,
classOf[GsonBigQueryInputFormat],
classOf[LongWritable],
classOf[JsonObject]
)
val convertedRDD: RDD[MyClass] = bigQueryRDD.map { case (_, jsonObject) =>
convertJsonObjectToMyClass(jsonObject)
}
val recentData: RDD[MyClass] = convertedRDD.filter { case MyClass(_, myDateField) =>
myDateField >= "2018-08-10"
}
println(recentData.count())
Вопросы
Мне интересно, запрашивает ли соединитель все данные из таблицы BigQuery, например:
SELECT *
FROM `project.dataset.table`
Или если он делает что-то умное (и более важное, менее дорогое), использующееразделение, например:
SELECT *
FROM `project.dataset.table`
WHERE myDateField >= TIMESTAMP("2018-08-10")
Кроме того, в общем, как я могу контролировать затраты на запрос и быть уверенным, что несущественные данные (здесь, например, данные до "2018-08-10"
)ничего не найдено?
в случае, если BigQuery извлекает все данные, могу ли я предоставить конкретный запрос?BigQueryConfiguration.INPUT_QUERY_KEY
(mapred.bq.input.query
) устарела, но я не вижу никакой замены, и документы не очень ясны по этому вопросу