所以我遇到一个问题,即在写入分区的Parquet文件时,DataFrame中的某些行会被删除。
以下是我的步骤:
mode=append
阅读的第一步按预期工作,没有解析问题。对于质量检查,我会执行以下操作:
对于date='2012-11-22'
的特定分区,请对CSV文件,加载的DataFrame和镶木地板文件执行计数。
以下是使用pyspark重现的一些代码:
logs_df = spark.read.csv('s3://../logs_2012/', multiLine=True, schema=get_schema()')
logs_df.filter(logs_df.date=='2012-11-22').count() # results in 5000
logs_df.write.partitionBy('date').parquet('s3://.../logs_2012_parquet/', mode='append')
par_df = spark.read.parquet('s3://.../logs_2012_parquet/')
par_df.filter(par_df.date=='2012-11-22').count() # results in 4999, always the same record that is omitted
我也尝试过写入HDFS,结果也一样。这发生在多个分区上。默认/空分区中没有记录。上面的logs_df
是准确无误的。
我试过的第二个实验是写一个未分区的拼花文件。上述代码的唯一区别是省略了partitionBy()
:
logs_df.write.parquet('s3://.../logs_2012_parquet/', mode='append')
加载此镶木地板集并运行上述计数会为date='2012-11-22'
和其他日期生成5000的正确结果。将模式设置为overwrite
或不设置(使用默认值)会导致相同的数据丢失。
我的环境是:
我非常感谢修复或解决方法或使用Spark转换为镶木地板文件的其他方式。
谢谢,
编辑:我无法重现第二个实验。所以,让我们说在写入Parquet或JSON时,分区和未分区似乎都会丢失记录。
答案 0 :(得分:0)
所以这个谜团肯定在模式定义中。然而,出乎意料的是它不是日期或时间戳。它实际上是布尔值。
我已从Redshift导出CSV,其中将bool写为t
和f
。当我检查推断的模式时,这些字段被标记为字符串类型。在CSV文件中使用true
和false
的简单测试将其识别为布尔值。
所以我期待日期和时间戳解析像往常一样出错,但它是布尔值。经验教训。
感谢指点。