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

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

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

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

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”)”),之后我的读取工作正常