【问题标题】:PySpark textFile replace textPySpark textFile 替换文本
【发布时间】:2021-01-14 13:54:06
【问题描述】:

以下是大约 30GB 示例文件中的几行

### s3://mybucket/tmp/file_in.txt
"one"|"mike"|"456"|"2010-01-04"
"two"|"lisa"|"789"|"2011-03-08"
"three"|"ann"|"845"|"2012-06-11"

我想使用 PySpark 来...

  • 使用 spark 的并行性读取文本文件
  • 将“n”字符替换为“X”
  • 将更新后的文本输出到相同格式的新文本文件中

所以生成的文件如下所示:

### s3://mybucket/tmp/file_out.txt
"oXe"|"mike"|"456"|"2010-01-04"
"two"|"lisa"|"789"|"2011-03-08"
"three"|"aXX"|"845"|"2012-06-11"

我尝试了各种方法来完成这个看似简单的任务......

data = sc.textFile('s3://mybucket/tmp/file_in.txt')

def make_replacement(row):
    result = row.replace("n", "X")
    return result

out_data = data.map(make_replacement).collect()

#out_data = data.map(lambda line: make_replacement(line)).collect()

out_data.coalesce(1).write.format("text").option("header", "false").save("s3://mybucket/tmp/file_out.txt")

但我仍然看到以下错误:

An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 3.0 failed 4 times, most recent failure: Lost task 0.3 in stage 3.0 (TID 21, <<my_server>>, executor 9): java.lang.RuntimeException: Failed to run command: /usr/bin/virtualenv -p python3 --system-site-packages virtualenv_application....
    at org.apache.spark.api.python.VirtualEnvFactory.execCommand(VirtualEnvFactory.scala:120)

注意:使用read.csv或dataframe的解决方案将不适用于此问题
有关如何解决此问题的任何建议?

【问题讨论】:

  • 您的问题似乎与 Python virtualenv 有关,而不是代码本身

标签: apache-spark pyspark amazon-emr


【解决方案1】:

您可以创建一个表达式并在select中调用该表达式

from pyspark.sql import functions as F

df = spark.read.csv('s3://mybucket/tmp/file_in.txt','\t')
expr = [F.regexp_replace(F.col(column), pattern="n", replacement="X").alias(column) for column in df.columns]

df = df.select(expr)
df.write.csv.format("text").option("header", "false").save("s3://mybucket/tmp/file_out.txt")

【讨论】:

  • 实际示例要求我不能使用数据框,因为存在分隔符问题。我只需要在读入数据框之前使用文本进行预处理。
【解决方案2】:

如果您不需要使用数据集,那您为什么还要寻找火花。

使用python文件读写代码并替换字符。

sample code

【讨论】:

  • 因为在python中逐行读取30GB的数据会比使用spark的分布式模型慢很多
  • 如您所愿,只是更新数据,无需进一步处理。所以成本(从文件共享读取到系统的时间将相同)
猜你喜欢
  • 2016-02-04
  • 2020-05-20
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2019-07-25
  • 2016-04-19
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多