我正在尝试将RDD转换为数据帧,但它失败并出现错误:
org.apache.spark.SparkException:由于阶段失败,作业被中止: 阶段2.0中的任务0失败4次,最近一次失败:任务0.3丢失 在阶段2.0(TID 11,10.139.64.5,执行者0)
这是我的代码:
items = [(1,12),(1,float('Nan')),(1,14),(1,10),(2,22),(2,20),(2,float('Nan')),(3,300),
(3,float('Nan'))]
sc = spark.sparkContext
rdd = sc.parallelize(items)
itemsRdd = rdd.map(lambda x: Row(id=x[0], col1=int(x[1])))
df = itemsRdd.toDF() # The error is thrown in this line.
答案 0 :(得分:1)
此代码有多个问题。
您在这里可能遇到的第一个问题是缺少Row
类的导入,因此方法toDF()
无法执行并无法为您的数据框创建逻辑计划。
第二个问题出现在col1
列的定义中。如果您尝试执行int(float('nan'))
,则会导致ValueError
,因此稍后在对数据框调用操作时会使执行崩溃。
您可以通过以下方式解决这两个问题:
items = [(1,12),(1,float('Nan')),(1,14),(1,10),(2,22),(2,20),(2,float('Nan')),
(3,300),(3,float('Nan'))]
sc = spark.sparkContext
rdd = sc.parallelize(items)
df = rdd.toDF(["id", "col1"])
如果您想重新输入列,建议您在要重新输入的特定列上使用cast
方法。与在每一行上强制使用Python类型相比,在Spark数据框中更改列类型是一种更安全,更快和更稳定的方法。