如何为pyspark制作干净的测试数据?我发现有些东西看起来不错,但是某些部分看起来有些尴尬,所以我要发布。
比方说,我有一个数据框df
,具有复杂的架构和少量的行。我想将测试数据签入我的仓库中。我不要二进制文件。在这一点上,我不确定最好的处理方法-但我想我有一个类似的文件
test_fn.py
里面有这个
schema_str='struct<eventTimestamp:timestamp,list_data:array<struct<valueA:string,valueB:string,valueC:boolean>>>'
使用df.schema.simpleString()
函数以txt格式获取模式。然后获取行-我这样做
lns = [row.json_txt for row in df.select((F.to_json(F.struct('*'))).alias('json_txt')).collect()]
现在我将这些行放在我的test_fn.py
文件中,或者我可以在仓库中有一个.json
文件。
现在要运行测试,我必须根据此文本使用正确的架构和数据制作一个数据框。似乎spark解析简单字符串的唯一方法是,如果我用它创建一个数据帧,那我不能将那个简单字符串传递给from_json
函数吗?所以这有点尴尬,这就是为什么我认为我会发布-
schema2 = spark.createDataFrame(data=[], schema=schema_str).schema
lns = # say I read the lns back from above
df_txt = spark.createDataFrame(data=lns, schema=T.StringType())
我看到df_txt只有一列称为“值”
df_json = df_txt.select(F.from_json('value', schema=schema2).alias('xx'))
sel = ['xx.%s' % nm for nm in df_json.select('xx').schema.fields[0].dataType.fieldNames()]
df2 = df_json.select(*sel)
现在df2
应该与df1
相同-我发现deepdiff
模块就是这种情况。