【问题标题】:Fail to convert an RDD to dataframe无法将 RDD 转换为数据帧
【发布时间】:2019-12-08 06:56:05
【问题描述】:

我正在尝试将 RDD 转换为数据帧,但失败并出现错误:

org.apache.spark.SparkException:作业因阶段失败而中止: 阶段 2.0 中的任务 0 失败 4 次,最近一次失败:丢失任务 0.3 在阶段 2.0 (TID 11, 10.139.64.5, executor 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.

【问题讨论】:

    标签: python dataframe apache-spark


    【解决方案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 方法。在 Spark 数据帧中更改列类型比在每一行上强制使用 Python 类型更安全、更快、更稳定。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2017-08-24
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多