写入Parquet的AWS EMR上的Spark 2.2.0会删除行

时间:2017-11-02 18:07:22

标签: amazon-web-services apache-spark pyspark spark-dataframe parquet

所以我遇到一个问题,即在写入分区的Parquet文件时,DataFrame中的某些行会被删除。

以下是我的步骤:

  1. 使用指定架构
  2. 从S3读取CSV数据文件
  3. 按'日期'列分区(日期类型)
  4. mode=append
  5. 写成Parquet

    阅读的第一步按预期工作,没有解析问题。对于质量检查,我会执行以下操作:

    对于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或不设置(使用默认值)会导致相同的数据丢失。

    我的环境是:

    • EMR 5.9.0
    • Spark 2.2.0
    • Hadoop发行版:亚马逊2.7.3
    • 尝试使用EMRFS一致视图而不是。但是,大多数测试都是写入HDFS以避免任何S3一致性问题。

    我非常感谢修复或解决方法或使用Spark转换为镶木地板文件的其他方式。

    谢谢,

    编辑:我无法重现第二个实验。所以,让我们说在写入Parquet或JSON时,分区和未分区似乎都会丢失记录。

1 个答案:

答案 0 :(得分:0)

所以这个谜团肯定在模式定义中。然而,出乎意料的是它不是日期或时间戳。它实际上是布尔值。

我已从Redshift导出CSV,其中将bool写为tf。当我检查推断的模式时,这些字段被标记为字符串类型。在CSV文件中使用truefalse的简单测试将其识别为布尔值。

所以我期待日期和时间戳解析像往常一样出错,但它是布尔值。经验教训。

感谢指点。