在Spark中读取带有跳过行的csv

时间:2019-06-10 17:08:43

标签: python csv apache-spark pyspark

我正在尝试将数据从csv文件加载到DataFrame。我必须使用spark.read.csv()函数,因为rdd sc.fileText()不适用于文件中的特定数据(csv数据中有不可见的逗号字符,rdd sc.fileText()将它们分开)。 csv文件在开始时要跳过几行:

Report <- to skip
Generated by YYYY-MM-DD <- to skip
Sessions <- to skip
<- to skip
Session of all hosts <- to skip
col1,col2,col3,col4,col5 <- it is my header
tst1,tst2,tst3,tst4,tst5 <- my data start here
tst6,tst7,tst8,tst9,tst10
...

我想要一个这样的数据框:

tst1,tst2,tst3,tst4,tst5 <- data
tst6,tst7,tst8,tst9,tst10

我尝试使用地图和过滤器功能,但无法正常工作:

.rdd.map(lambda line: str(line).split(','))\
.filter(lambda line: len(line)>3).collect()

1 个答案:

答案 0 :(得分:0)

我找不到让我跳过指定行数的任何内容,但是通过指定架构然后读入数据并过滤掉所有我不想带来的内容,我能够实现相同的结果。< / p>

import org.apache.spark.sql.types.{StructType, StringType}

val fileSchema = new StructType()
  .add("column1", StringType)
  .add("column2", StringType)
  .add("column3", StringType)
  .add("column4", StringType)
  .add("column5", StringType)

val data = spark.read.schema(fileSchema).csv("s3a://aws-s3-test-bucket/jeremy/foo.txt")
data.show(false)

哪个产量

+-----------------------+-------+-------+-------+-------+
|column1                |column2|column3|column4|column5|
+-----------------------+-------+-------+-------+-------+
|Report                 |null   |null   |null   |null   |
|Generated by YYYY-MM-DD|null   |null   |null   |null   |
|Sessions               |null   |null   |null   |null   |
|Session of all hosts   |null   |null   |null   |null   |
|col1                   |col2   |col3   |col4   |col5   |
|tst1                   |tst2   |tst3   |tst4   |tst5   |
|tst6                   |tst7   |tst8   |tst9   |tst10  |
+-----------------------+-------+-------+-------+-------+

然后,您可以过滤掉包含您不应该在其中找到的数据的行,例如您要跳过的行以及列名。

我建议在创建模式时使用实际的列名,而不是使用column1-> real_name_of_column1来获取所需数据框的占位符。在示例中,我使用占位符强调了一个事实,即创建架构时使用的列名不一定需要由数据告知。

+-----------------------+-------+-------+-------+-------+
|col1                   |col2   |col3   |col4   |col5   |
+-----------------------+-------+-------+-------+-------+
|tst1                   |tst2   |tst3   |tst4   |tst5   |
|tst6                   |tst7   |tst8   |tst9   |tst10  |
...
+-----------------------+-------+-------+-------+-------+