Spark,Scala在从文件读取后无法正确创建视图

Posted

技术标签:

【中文标题】Spark,Scala在从文件读取后无法正确创建视图【英文标题】:Spark, Scala not able to create view appropriately after reading from file 【发布时间】:2019-01-29 20:46:42 【问题描述】:

我在 jdk1.8 上使用 spark 和 scala。我是 Scala 新手。

我正在阅读一个文本文件 (pat1.txt),它看起来像:

现在我正在从我的 scala 代码中读取该文件:

val sqlContext = SparkSession.builder().getOrCreate()  
sqlContext.read
    .format(externalEntity.getExtractfileType)
    .option("compression", externalEntity.getCompressionCodec)
    .option("header", if (externalEntity.getHasHeader.toUpperCase == "Y") "true" else "false")
    .option("inferSchema", "true")
    .option("delimiter", externalEntity.getExtractDelimiter)
    .load(externalEntity.getFilePath)
    .createOrReplaceTempView(externalEntity.getExtractName)

然后从我的 scala 代码中进行查询:

val queryResult = sqlContext.sql(myQuery)

并生成输出为:

queryResult
 .repartition(LteGenericExtractEntity.getNumberOfFiles.toInt)
 .write.format("csv")
 .option("compression", LteGenericExtractEntity.getCompressionCodec)
 .option("delimiter", LteGenericExtractEntity.getExtractDelimiter)
 .option("header", "true"")
 .save(s"$outputDirectory/$extractFileBase")

现在当上面的'myQuery'是

select * from PAT1

程序生成 o/p 为(注意带有“值”的额外行,它不是文件的一部分)。基本上,该程序无法识别输入文件中的“,”分隔列,并且在输出中它在标题下创建了 1 个名为“值”的列。所以输出文件看起来像:

如果我将“myQuery”更改为:

select p1.FIRST_NAME, p1.LAST_NAME,p1.HOBBY  from PAT1 p1

它会抛出异常:

我的输入可以是任何格式(例如可以是 text/csv 并且可以进行压缩),输出将始终为 .csv

我很难理解如何更改读取部分,以便创建的视图可以适当地包含列。我可以得到帮助吗?

【问题讨论】:

我认为您必须在输入中将读取格式更改为 csv,例如 sqlContext.read.format("csv") 【参考方案1】:

这看起来像 csv 文件,但扩展名为 .txt。 您可以尝试以下方法:

    将此文件注册为csv,并带有spark.read.option("inferSchema", "true").option("header", "true").csv("path/to/file")等额外选项 按照您的方式读取文件后,只需将数据框的架构指定为:
    sqlContext.read.format("text")
          .option("compression", "none")
          .option("delimiter", ",")
          .option("header", "true")
          .load("/tmp/pat1")
          .toDF("first_name", "last_name", "hobby")

【讨论】:

感谢您的回复。用例是:1> 输入文件可以是任何格式,2> 需要动态生成模式,3> 需要生成一个视图,以便我们可以在该视图上查询。查询结果将以 .cvs 格式输出因此我无法将其更改为 DF,因为我实际上不知道架构 必须以 csv 格式读取,即使它是一个文本文件并添加了 ".option("inferSchema", "true")" 之后我的阅读工作正常

以上是关于Spark,Scala在从文件读取后无法正确创建视图的主要内容,如果未能解决你的问题,请参考以下文章

通过读取具有不同数据类型的 Scala 序列来创建 Spark 数据帧

无法从 synapse spark scala notebook 读取 csv 文件

使用 Spark 和 Scala 过滤掉任何无法正确解析的记录

scala - spark 读取本地文件并创表, 用作查询

如何读取 CSV 文件,然后在 Spark Scala 中将其保存为 JSON?

如何从 Spark 正确读取 S3 中的 .csv 文件? - 无法读取文件的页脚