以纯文本格式保存带有复杂模式的pyspark数据框以进行测试

时间:2019-03-13 21:42:16

标签: pyspark

如何为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模块就是这种情况。

0 个答案:

没有答案