【问题标题】:substring in rdd using pysparkrdd中的子字符串使用pyspark
【发布时间】:2019-12-23 16:22:53
【问题描述】:

我不是 RDD 方面的专家,并且正在寻找一些答案,我试图在 pyspark RDD 上执行一些操作但无法实现,特别是使用子字符串。我知道我可以通过将 RDD 转换为 DF 来做到这一点,但是想知道这是如何在前 DF 时代之前完成的?公司仍然更喜欢在 RDD 或数据帧中工作吗?

我的代码:

rdd= sc.textFile("Sales.txt")
##Taking only required columns and changing the data types
rdd_map = rdd.map(lambda line: (int((line.split("|")[0])),int((line.split("|")[1])),line.split("|")[4]))
##Filtering the data
rdd_filter = rdd_map.filter(lambda x: (x[0] > 43668) & ('-' in x[2]))
## Trying to perform substring
rdd_clean = rdd_filter.map(lambda x: x.substr(x[2],1,3))

数据样本:

43665|63|OLD ORDER|Sport-100 Helmet, Re|HL-U509-R
43668|87|OLD ORDER|Sport-100 Helmet, Re|HL-U509-R

完整的错误信息:

org.apache.spark.SparkException:作业因阶段失败而中止:阶段 50.0 中的任务 0 失败 1 次,最近失败:阶段 50.0 中丢失任务 0.0(TID 152,本地主机,执行程序驱动程序):org.apache .spark.api.python.PythonException: Traceback(最近一次调用最后一次):

【问题讨论】:

  • 请发布整个错误消息和Sales.txt的一些示例。
  • 更新了原始帖子中所需的详细信息,也想知道 op.1st 记录中发布的其他详细信息:43665|63|旧订单|Sport-100 头盔,Re|HL-U509-R 43668|87|旧订单|Sport-100 头盔,Re|HL-U509-R
  • 您的预期结果是什么?
  • 我想从结果中获取前 3 个字符 HL- ,但是我尝试使用以下代码经过一些研究后能够成功获得它 rdd_clean= rdd_filter.map(lambda x: x[ 2][1:3]) ,但我也想与 RDD 中的其他列一起获得结果

标签: apache-spark pyspark rdd


【解决方案1】:

我认为您可能可以使用 flatMap() 和列表推导来简化一些转换步骤:

>>> rdd = sc.parallelize([
      '43665|63|OLD ORDER|Sport-100 Helmet, Re|HL-U509-R'
    , '43668|87|OLD ORDER|Sport-100 Helmet, Re|HL-U509-R'
])

>>> rdd_clean = rdd.flatMap(lambda x: [ (int(e[0]), int(e[1]), e[4][:3]) for e in [x.split('|')] if ('-' in e[4]) & (int(e[0]) > 43665) ])

>>> rdd_clean.collect()
[(43668, 87, 'HL-')]    

在哪里,我使用flatMap() 来设置三项元组,然后移动filter() 并将x[2] 的子字符串放入列表理解中。如果你坚持你原来的方法,那就这样做:

rdd_clean = rdd_filter.map(lambda x: (x[0], x[1], x[2][:3]))

【讨论】:

  • 谢谢,我比我更喜欢你的方法,如果可能的话,有人可以解释一下 wen 使用 RDD vs df 吗?最新趋势是什么
猜你喜欢
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2020-04-08
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多