Apache spark 改进PySpark作业分析数据

Apache spark 改进PySpark作业分析数据,apache-spark,pyspark,google-bigquery,google-cloud-dataproc,Apache Spark,Pyspark,Google Bigquery,Google Cloud Dataproc,我在Google存储中有一些JSON文件,其中包含大量数据(500GiB到1TiB之间)。这些文件每行包含1个JSON对象,格式如下: {"country":"US", "col1":"val1", "col2":"val2", "col3":"val3"} {"country":"CA", "col1":"val4", "col2":"val5", "col3":"val6"} 我的目标是在BigQuery中为我可以在这些数据中找到的10个国家创建不同的表。因此,我将得到10个表,例如一个将

我在Google存储中有一些JSON文件,其中包含大量数据(500GiB到1TiB之间)。这些文件每行包含1个JSON对象,格式如下:

{"country":"US", "col1":"val1", "col2":"val2", "col3":"val3"}
{"country":"CA", "col1":"val4", "col2":"val5", "col3":"val6"}
我的目标是在BigQuery中为我可以在这些数据中找到的10个国家创建不同的表。因此,我将得到10个表,例如一个将命名为
data\u us
,模式为:
col1、col2、col3

我目前的做法是使用PySpark并在Google Dataproc上的计算机集群上运行作业:

    data = spark.read.json(bucket_source)
    data.createOrReplaceTempView('data')

    for c in country_list:
        table_name = "data_{}".format(c)
        query = "select col1, col2, col3, from data where language = '{}'".format(c)
        result_folder = "result_{}".format(c)
        result = spark.sql(query)
        push_bigquery(bucket_dest, cluster_name, project_name, dataset_name, result, result_folder, table_name)
所以基本上,我只是加载数据,创建一个视图,让PySpark为每个国家运行一个请求。然后我调用
push_bigquery
函数,它只是将结果转储到CSV文件中,并将其加载到bigquery中。这个解决方案可以工作,但对于大数据量(对于接近1TB的数据大小,大约12个小时)来说似乎有点慢

我有两个问题:

  • 我目前在每个国家运行一个查询,因此每个查询都会分析整个数据。是否有一种方法可以“分析”每一行并立即将其写入正确的结果/文件中?我觉得这样会更快,但我对Spark/PySpark不是很熟悉,但我不知道这个解决方案是否有意义

  • 有没有一种与使用Spark完全不同且更好的方法来完成此任务


感谢您的帮助

我错过了.cache,但根据N国家/地区N表的要求,以下是我的第一次尝试:

  • 没有缓存
  • 通过
    df.repartition(country)读取、重新分区并以非拼花地板(无需柱状)的形式写出。使用适当的选项写出…partitionBy(country)

  • 然后,我将根据分区意识对每个国家应用for循环,因为您确实需要单独的表,必须指出,这并不是完全必要的。即,一般来说,步骤2就足够了


  • 您可以使用@thebluephantom提供的代码对其进行优化 通过这样做,你会得到更多

    df.repartition(country).write...partitionBy(country)
    
    保存数据帧后,现在您将拥有每个国家的单独文件夹。
    因此,在运行bq load命令时,可以在这些文件夹上创建国家级表。通过这种方式,您无需进行任何进一步的处理,您将从所有大型查询表中分离数据。

    1 TB的数据在当今已不是一个大数目