Apache spark 从rdd转换为数据帧时索引超出范围

Apache spark 从rdd转换为数据帧时索引超出范围,apache-spark,pyspark-sql,Apache Spark,Pyspark Sql,我正在尝试将spark RDD转换为数据帧。当我将RDD转换为数据帧时,它还可以,但我得到的索引超出了范围错误 alarms = sc.textFile("hdfs://nanalyticsedge.com:8020/hdp/oneday.csv") alarms = alarms.map(lambda line: line.split(",")) header = alarms.first() alarms = alarms.filter(lambda line:line != header)

我正在尝试将spark RDD转换为数据帧。当我将RDD转换为数据帧时,它还可以,但我得到的索引超出了范围错误

alarms = sc.textFile("hdfs://nanalyticsedge.com:8020/hdp/oneday.csv")
alarms = alarms.map(lambda line: line.split(","))
header = alarms.first()
alarms = alarms.filter(lambda line:line != header)
alarms = alarms.filter(lambda line: len(line)>1)
alarms_df = alarms.map(lambda line: Row(IDENTIFIER=line[0],SERIAL=line[1],NODE=line[2],NODEALIAS=line[3],MANAGER=line[4],AGENT=line[5],ALERTGROUP=line[6],ALERTKEY=line[7],SEVERITY=line[8],SUMMARY=line[9])).toDF()
alarms_df.take(100)
这里alarms.count()工作正常,而alarms_df.count()给出的索引超出范围这是从oracle导出的数据

从@Dikei的回答中,我发现:

alarms = alarms.filter(lambda line: len(line) == 10)

为我提供了正确的数据帧,但为什么在数据库导出时数据帧会丢失?我如何防止它?

我认为问题在于您的某些行不包含10个元素。 很容易检查,试着换一下

alarms = alarms.filter(lambda line: len(line)>1)


没有提到索引的数据。如果数组包含的元素超过9个,请尝试类似的操作

myData.foreach { x => if(x.size.!=(9)){println(x(10))}  }
myData.foreach { x => if(x.size.!=(9)){println(x(10))}  }