【问题标题】:Convert RDD values in KVP to integers in PySpark将 KVP 中的 RDD 值转换为 PySpark 中的整数
【发布时间】:2017-12-01 16:45:10
【问题描述】:

我正在尝试将我的 RDD 键值对中的列 [2] 值从字符串转换为整数,以便能够将它们相加并计算平均值。

我试图在映射阶段让列 [2] 自动显示为整数,但出现错误“TypeError: 'type' object has no attribute 'getitem'”

textfile = sc.textFile("hdfs://...csv")
test = textfile.map(lambda x: (x.split(",")[1], x.split(",")(int[2]))

在 PySpark RDD 中将 column[2] 值转换/映射为整数的正确方法是什么?

【问题讨论】:

  • 您的错误是因为int[2] - 您试图从数据类型中获取第三项,这没有意义(这就是错误消息所说的)。我想你的意思是写:test = textfile.map(lambda x: (x.split(",")[1], int(x.split(",")[2])),即将x.split(",") 中的第二个元素转换为int。另请记住,python 是 0 索引的,因此您编写的代码假定 len(x.split(",")) >= 3
  • 完美运行,谢谢!

标签: python type-conversion integer pyspark rdd


【解决方案1】:

我建议试试这个

import numpy as np
mat = sc.parallelize([np.array(['', '10.0', '100.0']), np.array(['2.0', '', '200.0']), np.array(['50.0', '30.0', ''])])
colnumber = 2
rdd_col = mat.map(lambda x: x[colnumber])
rdd_col_without_na = rdd_col.filter(lambda x: x!='')
rdd_float = rdd_col_without_na.map(lambda x:[x]).map(lambda x: float(x[0]))

然后您可以使用 mean() 函数计算平均值

meanOfRddCol = rdd_float.mean()

【讨论】:

    【解决方案2】:

    正如评论中指出的,问题在于索引。但是我想补充一点,您还应该检查空值,并且您可以立即使用元组,这更容易理解和使用。

    我建议做以下事情:

    test = textfile.map(lambda x: x.split(','))
    remove_nulls = test.filter(lambda (x,y): y is not None)
    with_ints = remove_nulls.map(lambda (x,y): (x,int(y)))
    

    现在您可以轻松计算平均值

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 1970-01-01
      • 2021-06-29
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2017-01-25
      相关资源
      最近更新 更多