我正在使用Google's official Spark-BigQuery connector(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
)已过时,但我看不到任何替代内容,而且文档对此不太清楚