在Spark中导入具有不同列数的文本文件

时间:2018-05-03 15:24:42

标签: apache-spark pyspark

我有一个包含不同数量列的竖线分隔文件,如下所示:

[root@RHEL7lab /]# grep "^[A-Za-z|*]*\.[A-Za-z|*]" /etc/rsyslog.conf | grep "\s@"
auth.*,authpriv.*               @loghost.example.com:10514 # One "@" means UDP
*.*                             @@loghost.example.com      # Two "@" means TCP
[root@RHEL7lab /]#

我试图找到一种优雅的方法,使用pyspark将其导入数据框。我可以尝试修复文件以添加尾随|当最后一列丢失时(只有最后一列可能丢失),但很想找到一个不涉及更改输入文件的解决方案。

1 个答案:

答案 0 :(得分:3)

您可以使用模块pyspark.sql.readwriter中的方法csv并设置mode="PERMISSIVE"

df = sqlCtx.read.csv("/path/to/file.txt", sep="|", mode="PERMISSIVE", header=True)
df.show(truncate=False)
#+---+-----+---------+--------------+
#|id |name |attribute|extraattribute|
#+---+-----+---------+--------------+
#|1  |alvin|cool     |funny         |
#|2  |bob  |tall     |null          |
#|3  |cindy|smart    |funny         |
#+---+-----+---------+--------------+

来自文档:

  

PERMISSIVE:当其他字段遇到损坏时将其设置为null   记录。

     

当用户设置架构时,它会为额外字段设置null。

这比what I originally suggested in the comments容易得多。