无法将RDD转换为数据帧

时间:2019-07-30 19:57:37

标签: python dataframe apache-spark

我正在尝试将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.

1 个答案:

答案 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数据框中更改列类型是一种更安全,更快和更稳定的方法。