【问题标题】:How to replace double quotes with a newline character in spark scala如何在spark scala中用换行符替换双引号
【发布时间】:2020-08-20 05:58:31
【问题描述】:

我是新来的火花。我有一个巨大的文件,其中包含类似的数据 -

18765967790@18765967790@T@20130629@00@31@2981546 " "18765967790@18765967790@T@20130629@19@18@3240165 " "18765967790@18765967790@T@20130629@18@18@1362836
13478756094@13478756094@T@20130629@31@26@2880701 " "13478756094@13478756094@T@20130629@19@18@1230206 " "13478756094@13478756094@T@20130629@00@00@1631440
40072066693@40072066693@T@20130629@79@18@1270246 " "40072066693@40072066693@T@20130629@79@18@3276502 " "40072066693@40072066693@T@20130629@19@07@3321860

我正在尝试用换行符替换“”,以便我的输出看起来像这样-

18765967790@18765967790@T@20130629@00@31@2981546 
18765967790@18765967790@T@20130629@19@18@3240165 
18765967790@18765967790@T@20130629@18@18@1362836
13478756094@13478756094@T@20130629@31@26@2880701 
13478756094@13478756094@T@20130629@19@18@1230206 
13478756094@13478756094@T@20130629@00@00@1631440
40072066693@40072066693@T@20130629@79@18@1270246 
40072066693@40072066693@T@20130629@79@18@3276502 
40072066693@40072066693@T@20130629@19@07@3321860

我试过了-

val fact1 =  sc.textFile("s3://abc.txt").map(x=>x.replaceAll("\"","\n"))

但这似乎不起作用。有人能告诉我我错过了什么吗?

Edit1- 我的最终输出将是一个数据框,其架构在用分隔符“@”拆分后强加。

我低于 o/p-

scala> fact1.take(5).foreach(println)
18765967790@18765967790@T@20130629@00@31@2981546

18765967790@18765967790@T@20130629@19@18@3240165

18765967790@18765967790@T@20130629@18@18@1362836
13478756094@13478756094@T@20130629@31@26@2880701

13478756094@13478756094@T@20130629@19@18@1230206

13478756094@13478756094@T@20130629@00@00@1631440
40072066693@40072066693@T@20130629@79@18@1270246

40072066693@40072066693@T@20130629@79@18@3276502

40072066693@40072066693@T@20130629@19@07@3321860

我得到了额外的空白行,这进一步困扰我创建数据框。这在这里可能看起来很简单,但文件很大,包含“”的行也很长。在问题中,我只放了 2 个双引号,但它们的数量可能超过 40-50。

【问题讨论】:

  • 你的输出是什么?
  • 可能你想像这样替换它x.replaceAll(" \" \"","\n")
  • 你做的是正确的,你的实际输出是什么?试试下面看看有什么不同:val file = spark.sparkContext.textFile("sc.textFile(\"s3://abc.txt\")") file.foreach(print) val fact1 = file.map(x=>x.replaceAll("\"","\n")) fact1.foreach(print)
  • @Belwal 我得到了一些空白行
  • 我认为是因为多个引号。

标签: scala apache-spark apache-spark-sql rdd


【解决方案1】:

文本之间有不止一个引号,这会创建多个换行符。您要么需要在替换之前删除额外的引号,要么在替换之后删除空行:

.map(x=>x.replaceAll("\"","\n").replaceAll("(?m)^[ \t]*\r?\n", ""))

参考:Remove all empty lines

【讨论】:

  • 但是没有其他方法可以用换行符或 spark 中的任何其他字符替换所有“”吗?
  • Spark 提供了一种转换(如本例中的地图)数据的方法。现在你想改变什么取决于你。我们只是在操作字符串,这也可以通过不同的方式完成,spark 与它无关。
【解决方案2】:

您可能缺少隐式编码器,您尝试如下代码

spark.read.text("src/main/resources/doubleQuoteFile.txt").map(row => {
      row.getString(0).replace("\"","\n") // looking to replace " " with next line
      row.getString(0).replace("\" \"","\n") // looking to replace " " with next line
    })(org.apache.spark.sql.Encoders.STRING)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2015-07-31
    • 2011-01-26
    相关资源
    最近更新 更多