Python 索引器错误:列表索引超出范围,场景不同
我有这个错误发生,我可以找到多个关于这个错误的stackoverflow帖子,并且我能够关联这些帖子中给出的解释。但是我的场景不同。 我在Spark 1.6.1环境中执行以下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
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