【问题标题】:Pyspark read multiple csv files into a dataframe in orderPyspark 按顺序将多个 csv 文件读入数据帧
【发布时间】:2019-01-07 09:30:24
【问题描述】:

当我尝试通过 pyspark(2.2.1) 将包含多个 CSV 文件的折叠读入数据帧时,数据记录的顺序异常。数据文件夹是由另一个Spark程序创建的,文件类似于

/path/part-00000-*
/path/part-00001-*
......

每个文件只包含一条记录。某些记录在某些列中具有空值。

记录应该按一列排序,我确定文件的顺序是正确的,即part-00000-*包含第一条记录,part-00001-*包含第二条记录...

但是,当我通过 pyspark 将数据读入数据框时:

df = SQLContext(sc).read.format('csv')
    .option('header', 'true')
    .option('mode', 'DROPMALFORMED')
    .load('/path')

顺序已更改(数据应按列timestamp 排序)。我注意到顶部的记录没有空值:

+--------------------+-----------+--------------+--------------+
|                time|  timestamp|         attr1|         attr2|
+--------------------+-----------+--------------+--------------+
|2018-09-30 21:33:...| 1538314433| 1538314433000| 1538314433000|
|2018-09-30 21:35:...| 1538314544| 1538314544000| 1538314544000|
|2018-09-30 21:38:...| 1538314682| 1538314682000| 1538314682000|
|2018-09-30 21:38:...| 1538314734| 1538314734000| 1538314734000|
|2018-09-30 21:25:...| 1538313912|          null| 1538313912000|
|2018-09-30 21:25:...| 1538313913|          null| 1538313913000|
|2018-09-30 21:25:...| 1538313914|          null| 1538313914000|
|2018-09-30 21:25:...| 1538313915|          null| 1538313915000|
|2018-09-30 21:25:...| 1538313932|          null| 1538313932000|
|2018-09-30 21:25:...| 1538313934| 1538313934000|          null|
|2018-09-30 21:25:...| 1538313942|          null| 1538313942000|
|2018-09-30 21:25:...| 1538313943|          null| 1538313943000|
|2018-09-30 21:26:...| 1538314007|          null| 1538314007000|
|2018-09-30 21:27:...| 1538314026| 1538314026000|          null|
|2018-09-30 21:27:...| 1538314028|          null| 1538314028000|
|2018-09-30 21:27:...| 1538314029|          null| 1538314029000|
|2018-09-30 21:27:...| 1538314043| 1538314043000|          null|
|2018-09-30 21:27:...| 1538314064| 1538314064000|          null|
|2018-09-30 21:27:...| 1538314067| 1538314067000|          null|

我想知道为什么会发生这种情况以及如何以正确的顺序加载数据框。

【问题讨论】:

  • 您在分布式文件系统上。正确的顺序并不意味着什么。您需要有一个业务规则来创建订单。

标签: apache-spark dataframe pyspark


【解决方案1】:

如果要按时间戳排序,只需添加orderBy 子句:

df.orderBy('timestamp').show()

【讨论】:

  • 是的,它可以,但我只想知道为什么加载的数据是无序的。
  • 它们是无序的,因为一张桌子的行为就像一袋弹珠。你不能把任何订单放在包里。当您从袋子中取出弹珠时,您可以创建一个人工订单。
  • 好的,我明白了,谢谢! BTW,有没有办法指定多个文件的输入顺序?
  • 这没有意义。不管你包里弹珠的输入顺序是什么,之后它们都不会保持这个顺序!
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多