Spark,Scala在读取文件后无法正确创建视图
我正在jdk1.8上使用spark和scala。我是scala新手 我正在读取一个文本文件(pat1.txt),看起来像:Spark,Scala在读取文件后无法正确创建视图,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我正在jdk1.8上使用spark和scala。我是scala新手 我正在读取一个文本文件(pat1.txt),看起来像: val sqlContext = SparkSession.builder().getOrCreate() sqlContext.read .format(externalEntity.getExtractfileType) .option("compression", externalEntity.getCompressionCodec) .o
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)
val queryResult = sqlContext.sql(myQuery)
select p1.FIRST_NAME, p1.LAST_NAME,p1.HOBBY from PAT1 p1
现在我从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)
val queryResult = sqlContext.sql(myQuery)
select p1.FIRST_NAME, p1.LAST_NAME,p1.HOBBY from PAT1 p1
然后根据我的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)
val queryResult = sqlContext.sql(myQuery)
select p1.FIRST_NAME, p1.LAST_NAME,p1.HOBBY from PAT1 p1
并将输出生成为:
queryResult
.repartition(LteGenericExtractEntity.getNumberOfFiles.toInt)
.write.format("csv")
.option("compression", LteGenericExtractEntity.getCompressionCodec)
.option("delimiter", LteGenericExtractEntity.getExtractDelimiter)
.option("header", "true"")
.save(s"${outputDirectory}/${extractFileBase}")
select * from PAT1
现在当上面的“myQuery”为
queryResult
.repartition(LteGenericExtractEntity.getNumberOfFiles.toInt)
.write.format("csv")
.option("compression", LteGenericExtractEntity.getCompressionCodec)
.option("delimiter", LteGenericExtractEntity.getExtractDelimiter)
.option("header", "true"")
.save(s"${outputDirectory}/${extractFileBase}")
select * from PAT1
程序正在生成o/p as(请注意带有“value”的额外行,它不是文件的一部分。基本上,程序无法识别输入文件中的“,”分隔列,在输出中,它在标题下创建了1列,该列名为“value”。因此,输出文件如下所示:
如果我将“myQuery”更改为:
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)
val queryResult = sqlContext.sql(myQuery)
select p1.FIRST_NAME, p1.LAST_NAME,p1.HOBBY from PAT1 p1
它抛出异常为:
queryResult
.repartition(LteGenericExtractEntity.getNumberOfFiles.toInt)
.write.format("csv")
.option("compression", LteGenericExtractEntity.getCompressionCodec)
.option("delimiter", LteGenericExtractEntity.getExtractDelimiter)
.option("header", "true"")
.save(s"${outputDirectory}/${extractFileBase}")
select * from PAT1
我的输入可以是任何格式(比如可以是文本/csv,也可以有压缩),输出将始终是.csv格式
我很难理解如何更改已读部分,以便创建的视图可以适当地包含列。我可以获得相关帮助吗。这看起来像csv文件,但扩展名为.txt。 您可以尝试以下方法:
csv
,带有额外的选项,如spark.read.option(“推断模式”、“真”).option(“标题”、“真”).csv(“路径/到/文件”)
我认为您必须将输入中的读取格式更改为csv,如sqlContext.read.format(“csv”),谢谢您的回复。用例是:1>输入文件可以是任何格式,2>需要动态生成模式,3>需要生成该模式的视图,以便我们可以查询该视图。查询结果将以.cvs格式输出,因此我无法将其更改为DF,因为我不知道模式实际上应该读取为csv,即使它是一个文本文件并添加了“.option”(“Infreschema”,“true”)”),之后我的读取工作正常