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 过滤掉任何无法正确解析的记录