Python 索引器错误:列表索引超出范围,场景不同

Python 索引器错误:列表索引超出范围,场景不同,python,apache-spark,Python,Apache Spark,我有这个错误发生,我可以找到多个关于这个错误的stackoverflow帖子,并且我能够关联这些帖子中给出的解释。但是我的场景不同。 我在Spark 1.6.1环境中执行以下python代码: 1 from pyspark import SparkContext 2 sc = SparkContext("local", "Simple App") 3 from pyspark.sql import SQLContext, Row 4 sqlContext = SQLContext

我有这个错误发生,我可以找到多个关于这个错误的stackoverflow帖子,并且我能够关联这些帖子中给出的解释。但是我的场景不同。 我在Spark 1.6.1环境中执行以下python代码:

  1 from pyspark import SparkContext
  2 sc = SparkContext("local", "Simple App")
  3 from pyspark.sql import SQLContext, Row
  4 sqlContext = SQLContext(sc)
  5
  6 ssn = sc.textFile("/Data/amitesh")
  7
  8 parts_ssn = ssn.map(lambda l: l.split(','))
  9 #wow = ssn.map(lambda ())
 10
 11 stg_ssn = parts_ssn.map(lambda p: Row(name=p[0]))
 12 stg = sqlContext.createDataFrame(parts_ssn, ['name','age','city'])
 13 stg.take(5)
我收到的错误指向第12行。 在我的hdfs环境中,在/Data/amitesh下有3个txt文件,每个文件有3列。这3个文件都有相同的模式,即名称、年龄、城市。但文件中没有标题。但行数可能不同

下面是完整的堆栈转储

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/iop/4.2.0.0/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/iop/4.2.0.0/spark/lib/spark-assembly-1.6.1_IBM_4-hadoop2.7.2-IBM-12.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Traceback (most recent call last):
  File "location_to/master.py", line 16, in <module>
    stg = sqlContext.createDataFrame(parts_ssn, ['name','age','city'])
  File "location_to/context.py", line 423, in createDataFrame
  File "location_to/context.py", line 315, in _createFromRDD
IndexError: list index out of range
我正在使用spark submit执行代码

spark提交-master local master.py


有什么建议吗

发布评论作为答案,因为它解决了问题:

当准备RDD将其转换为DataFrame时,创建的行条目仅包含一个列名,但当创建DataFrame时,提供的架构包含三个列:name、age、city

创建DataFrame时,行对象中的列需要与提供的架构匹配。所以它应该是这样的:

stg_ssn = parts_ssn.map(lambda p: Row(name=p[0], age=p[1], city=p[2]))
stg = sqlContext.createDataFrame(parts_ssn, ['name','age','city'])

这假设p当然包含三个条目。

我的预期输出是查看5行的列内容context.py的第315行是什么样子的?当我尝试转到该位置时,该文件似乎是名为pyspark.py的.zip dir的一部分,我猜这是pyspark控制台的默认支持目录。在我看来,您创建的行只有一个列名,但在创建dataframe时,会给出一个包含三个列名的模式,分别是name、age、city。因此,您可能需要将lambda调整为lambda p:Rowname=p[0],age=,city=。好的,错误消失了。谢谢@LiMuBei