[英]DateTime datatype in BigQuery
我有一个分区表,其中一列的类型为 DateTime,并且该表在同一列上分区。 根据spark-bigquery文档,对应的Spark SQL类型是String类型。 https://github.com/GoogleCloudDataproc/spark-bigquery-connector
我尝试做同样的事情,但我遇到了数据类型不匹配的问题。
代码片段:
ZonedDateTime nowPST = ZonedDateTime.ofInstant(Instant.now(), TimeZone.getTimeZone("PST").toZoneId());
df = df.withColumn("createdDate", lit(nowPST.toLocalDateTime().toString()));
错误:
Caused by: com.google.cloud.spark.bigquery.repackaged.com.google.cloud.bigquery.BigQueryException: Failed to load to <PROJECT_ID>:<DATASET_NAME>.<TABLE_NAME> in job JobId{project=<PROJECT_ID>, job=<JOB_ID>, location=US}. BigQuery error was Provided Schema does not match Table <PROJECT_ID>:<DATASET_NAME>.<TABLE_NAME>. Field createdDate has changed type from DATETIME to STRING
at com.google.cloud.spark.bigquery.BigQueryWriteHelper.loadDataToBigQuery(BigQueryWriteHelper.scala:156)
at com.google.cloud.spark.bigquery.BigQueryWriteHelper.writeDataFrameToBigQuery(BigQueryWriteHelper.scala:89)
... 36 more
由于 Spark 不支持DateTime
,BigQuery 连接器不支持写入DateTime
- 没有可以使用的等效 Spark 数据类型。 我们正在探索增加 DataFrame 元数据的方法,以支持 BigQuery 支持的类型,而不是 Spark 支持的类型( DateTime
、 Time
、 Geography
)。
目前请将此字段设为字符串,并在 BigQuery 端进行转换。
对于日期时间类型。 我可以将表从数据块获取到 BigQuery 的唯一方法(无需创建临时表并插入数据,因为由于表的大小,这仍然会很昂贵)是将表写入 CSV 到 GCS Bucket
results_df.write.format("csv").mode("overwrite").save("gs://<bucket-name>/ancillary_test")
然后将数据从存储桶加载到指定架构的 BigQuery 中的表
LOAD DATA INTO <dataset>.<tablename>(
PRICENODEID INTEGER,
ISONAME STRING,
PRICENODENAME STRING,
MARKETTYPE STRING,
GMTDATETIME TIMESTAMP,
TIMEZONE STRING,
LOCALDATETIME DATETIME,
ANCILLARY STRING,
PRICE FLOAT64,
CHANGE_DATE TIMESTAMP
)
FROM FILES (
format = 'CSV',
uris = ['gs://<bucket-name>/ancillary_test/*.csv']
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.