Apache spark 改进PySpark作业分析数据
我在Google存储中有一些JSON文件,其中包含大量数据(500GiB到1TiB之间)。这些文件每行包含1个JSON对象,格式如下: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个表,例如一个将
{"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)
您可以使用@thebluephantom提供的代码对其进行优化 通过这样做,你会得到更多
df.repartition(country).write...partitionBy(country)
保存数据帧后,现在您将拥有每个国家的单独文件夹。
因此,在运行bq load命令时,可以在这些文件夹上创建国家级表。通过这种方式,您无需进行任何进一步的处理,您将从所有大型查询表中分离数据。1 TB的数据在当今已不是一个大数目