我正在尝试将数据从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()
答案 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 |
...
+-----------------------+-------+-------+-------+-------+