Google bigquery 如何使用文件名中的分区值将分区数据写入文件?

Google bigquery 如何使用文件名中的分区值将分区数据写入文件?,google-bigquery,google-cloud-storage,pyspark,google-cloud-dataproc,pyspark-sql,Google Bigquery,Google Cloud Storage,Pyspark,Google Cloud Dataproc,Pyspark Sql,我每月从一个RDBMS中卸载一堆数据,并基于该月将其加载到Google云存储(GCS)中。然后,我将整个数据集读取到dataproc集群上的pyspark数据帧中,并希望根据日期而不是月份将其重新写入GCS。我已成功写入云存储,其中每个文件仅包含特定日期,但无法有效地根据该日期命名文件或目录。下面的代码做了我希望它做的事情,但是效率很低。我也知道理论上我可以通过使用拼花文件来解决这个问题,但我的要求是以CSV格式编写。最后,我想每天用一个表将这些数据加载到bigquery中,如果有更简单的解决方

我每月从一个RDBMS中卸载一堆数据,并基于该月将其加载到Google云存储(GCS)中。然后,我将整个数据集读取到dataproc集群上的pyspark数据帧中,并希望根据日期而不是月份将其重新写入GCS。我已成功写入云存储,其中每个文件仅包含特定日期,但无法有效地根据该日期命名文件或目录。下面的代码做了我希望它做的事情,但是效率很低。我也知道理论上我可以通过使用拼花文件来解决这个问题,但我的要求是以CSV格式编写。最后,我想每天用一个表将这些数据加载到bigquery中,如果有更简单的解决方案的话(然后我可以将每天的每个表导出到一个文件中)

假设我读取的数据的日期为['2014-01-01','2014-01-02','2014-01-03'],我希望生成的文件/目录如下所示:

gs://buck_1/AUDIT/2014-01-01/part-1
gs://buck_1/AUDIT/2014-01-01/part-2
gs://buck_1/AUDIT/2014-01-01/part-3
gs://buck_1/AUDIT/2014-01-01/part-4

gs://buck_1/AUDIT/2014-01-02/part-1
gs://buck_1/AUDIT/2014-01-02/part-2
gs://buck_1/AUDIT/2014-01-02/part-3
gs://buck_1/AUDIT/2014-01-02/part-4

gs://buck_1/AUDIT/2014-01-03/part-1
gs://buck_1/AUDIT/2014-01-03/part-2
gs://buck_1/AUDIT/2014-01-03/part-3

gs://buck_1/AUDIT/2014-01-03/part-4

是否接近您的需求?绝对接近。这允许我对数据进行分区,并确保特定文件只包含一个日期的数据(即使在多个文件中)。但是,它不允许基于该日期将我的名字命名为我的文件/目录。换句话说,我需要读取文件才能知道其中的数据是多少天,而不是通过路径。使用df.write.paritionBy('year','month')编写文本数据集产生了如下布局要点:这并不完全是您想要的,但可能是最简单的方法。在此基础上,您可以在数据集中进一步创建一个带有格式化日期的新列,并将其用作ParionBy值。完整的调用如下所示:df.write.ParionBy('the_date')。format('text')。save()确实接近您所需的值?绝对接近。这允许我对数据进行分区,并确保特定文件只包含一个日期的数据(即使在多个文件中)。但是,它不允许基于该日期将我的名字命名为我的文件/目录。换句话说,我需要读取文件才能知道其中的数据是多少天,而不是通过路径。使用df.write.paritionBy('year','month')编写文本数据集产生了如下布局要点:这并不完全是您想要的,但可能是最简单的方法。在此基础上,您可以在数据集中进一步创建一个带有格式化日期的新列,并将其用作parionby值。完整调用如下所示:df.write.parionby('the_date')。format('text')。save()
# Find distinct dates, and then write based on that.
dates = sqlContext.sql("SELECT distinct THE_DATE FROM tbl")

x = dates.collect()

for d in x:
    date = d.SLTRN_DT

    single_wk = sqlContext.sql("SELECT * FROM tbl where THE_DATE = '{}'".format(date))

    towrite = single_wk.map(to_csv)

    towrite.coalesce(4).saveAsTextFile('gs://buck_1/AUDIT/{}'.format(date))