如何在Spark Scala中动态Map没有头的管道分隔文本文件的模式?

az31mfrm  于 2023-06-06  发布在  Scala
关注(0)|答案(2)|浏览(172)

我使用的是Spark 2.x版本。
我试图在Spark Scala中从一个没有头的管道分隔文本文件中阅读spark变量中的内容后动态Map模式。
文本文件内容-文件.txt:

12345678910|abc|234567
54182124852|def|784964

要Map的架构:

FS1|FS2|FS3

下面是我试过的代码。我也尝试了下面的代码从下面的链接的例子,但它不工作。https://sparkbyexamples.com/spark/spark-read-text-file-rdd-dataframe/#dataframe-read-text

import org.apache.spark.sql.{DataFrame, Dataset}

val df = spark.read.text("dbfs:/FileStore/tables/Sample1-1.txt")

import spark.implicits.
val dataRDD = df.map(x => {
val elements = x.getString(0).split("|")
(elements(0),elements(1),elements(2))
}).toDF("FS1","FS2","FS3")
dataRDD.printSchema()
dataRDD.show(false)

在执行上面的代码后,我得到了下面的输出,这是不期望的,

\+---+---+---+
|fs1|fs2|fs3|
\+---+---+---+
|1  |2  |3  |
|5  |4  |1  |
\+---+---+---+

我希望新文件被保存为- File1.txt,其中将包含文件内容沿着标题

FS1|FS2|FS3
12345678910|abc|234567
54182124852|def|784964
jchrr9hc

jchrr9hc1#

你只需要添加一个头文件到你的csv文件。
你有一个文本文件,你已经知道分隔符是|
你应该写点这样的东西

import org.apache.spark.sql.DataFrame

val df = spark.read.option( "delimiter", "|" ).csv("dbfs:/FileStore/tables/Sample1-1.txt")
val columns = Seq("FS1", "FS2", "FS3")
val resultDF = df.toDF(columns :_*)

// If you want your result as one file, you can use coalesce.

resultDF.coalesce(1)
      .write
      .option("header","true")
      .option("delimiter","|")
      .mode("overwrite")
      .csv("output/path")
rqdpfwrv

rqdpfwrv2#

我不知道保存文件.txt文件格式背后的原因。将其保存为.txt文件格式有点棘手。
如果你能用.csv格式写一个Dataframe,就像下面这样

dataRDD.write.option("header", "true").option("delimiter", "|").csv("output/")

那就很容易了。

相关问题