Pyspark 如何迭代代码存储库中的json文件并以增量方式附加到数据集

Pyspark 如何迭代代码存储库中的json文件并以增量方式附加到数据集,pyspark,palantir-foundry,foundry-code-repositories,foundry-code-workbooks,Pyspark,Palantir Foundry,Foundry Code Repositories,Foundry Code Workbooks,我已经通过数据连接将一个包含100000个约100gb原始json文件的数据集导入foundry。我想使用Python Transforms原始文件访问转换来读取文件,将结构数组和结构展平为数据帧,作为对df的增量更新。 我想使用*.json文件文档中以下示例中的类似内容,并使用@incremental()装饰器将其转换为增量更新 >>> import csv >>> from pyspark.sql import Row >>> from

我已经通过数据连接将一个包含100000个约100gb原始json文件的数据集导入foundry。我想使用
Python Transforms原始文件访问
转换来读取文件,将结构数组和结构展平为数据帧,作为对df的增量更新。 我想使用*.json文件文档中以下示例中的类似内容,并使用
@incremental()
装饰器将其转换为增量更新

>>> import csv
>>> from pyspark.sql import Row
>>> from transforms.api import transform, Input, Output
>>>
>>> @transform(
...     processed=Output('/examples/hair_eye_color_processed'),
...     hair_eye_color=Input('/examples/students_hair_eye_color_csv'),
... )
... def example_computation(hair_eye_color, processed):
...
...    def process_file(file_status):
...        with hair_eye_color.filesystem().open(file_status.path) as f:
...            r = csv.reader(f)
...
...            # Construct a pyspark.Row from our header row
...            header = next(r)
...            MyRow = Row(*header)
...
...            for row in csv.reader(f):
...                yield MyRow(*row)
...
...    files_df = hair_eye_color.filesystem().files('**/*.csv')
...    processed_df = files_df.rdd.flatMap(process_file).toDF()
...    processed.write_dataframe(processed_df)
在@Jeremy David Gamet的帮助下,我能够开发代码来获得我想要的数据集

from transforms.api import transform, Input, Output
from  pyspark import *
import json


@transform(
     out=Output('foundry/outputdataset'),
     inpt=Input('foundry/inputdataset'),
 )
def update_set(ctx, inpt, out):
    spark = ctx.spark_session
    sc = spark.sparkContext

    filesystem = list(inpt.filesystem().ls())
    file_dates = []
    for files in filesystem:
        with inpt.filesystem().open(files.path,'r', encoding='utf-8-sig') as fi:
            data = json.load(fi)
        file_dates.append(data)

    json_object = json.dumps(file_dates)
    df_2 = spark.read.option("multiline", "true").json(sc.parallelize([json_object]))

    df_2.drop_duplicates()
# this code to [Flatten array column][1]
    df_2 = flatten(df_2)
    out.write_dataframe(df_2)

编码到

上面的代码适用于少数文件,因为这些文件超过1000000,我遇到了以下错误:

Connection To Driver Lost 

This error indicates that connection to the driver was lost unexpectedly, which is often caused by the driver being terminated due to running out of memory. Common reasons for driver out-of-memory (OOM) errors include functions that materialize data to the driver such as .collect(), broadcasted joins, and using Pandas dataframes.


有没有办法解决这个问题?

我给出了一个例子,说明如何动态地完成这项工作,作为对另一个问题的回答

以下是该代码答案的链接:以及同一代码的副本:

from transforms.api导入输入、输出、转换
从pyspark.sql导入函数为F
导入json
导入日志记录
def transform_生成器():
转换=[]
transf_dict={##在此处输入动态映射##}
对于transf_dict中的值:
@转化(
out=Output('此处输出的路径'。格式(val=value)),
inpt=Input(“此处输入的路径”。格式(val=value)),
)
def更新设置(ctx、输入、输出):
spark=ctx.spark\u会话
sc=spark.sparkContext
filesystem=list(inpt.filesystem().ls())
文件日期=[]
对于文件系统中的文件:
将inpt.filesystem()作为fi打开(files.path):
data=json.load(fi)
文件\u dates.append(数据)
logging.info('info logs:')
logging.info(文件\u日期)
json\u object=json.dumps(文件\u日期)
df_2=spark.read.option(“multiline”,“true”).json(sc.parallelize([json_object]))
df_2=df_2.withColumn('upload_date',F.current_date())
df_2.删除重复项()
out.write_数据帧(df_2)
transforms.append(更新日志)
返回变换
TRANSFORMS=transform_生成器()

如果有什么我可以澄清的,请告诉我。

你应该能够导入json而不是CSV,上面的例子我没有时间给你一个完整的atm示例,但是你上面的编辑似乎是正确的。我会在今天晚些时候或明天发一些东西morning@fmsf,我可以将json文件解析为字符串,但这并不是推断列的模式。关于您上次的编辑,听起来好像您遇到了驱动程序的内存限制。可能json或json的数量太大,无法处理。您需要增加驱动程序内存,或者对其处理方式进行创新,比如不并行,或者使用更小的JSON。如果解析对单个JSON有效,那么这里的解决方案就是增量解析,不过如果重新计算,这种情况还会发生。对于增量解析部分,您只需要在
@transform
的顶部添加
@incremental(semantic_version=1)
。如果您增加语义版本,它将切换到完全重新计算,如果您保持不变,后续生成将只生成未处理的文件。另外,行
转换。通过错误追加(更新日志)
作为未定义。您能帮助理解这行代码中发生了什么吗
transforms=[]transf_dict={####}
,什么是预期的映射,它是json模式?谢谢你,它帮助我构建了数据集,如何将其转换为增量更新,或者我们不能像json文件那样工作?尽管有了你的代码,我能够生成数据,但对于所有的文件,我都在处理oom问题,有什么办法吗?