Java 参考';单位';不明确,可能是:单位,单位

Java 参考';单位';不明确,可能是:单位,单位,java,apache-spark,kotlin,amazon-s3,delta-lake,Java,Apache Spark,Kotlin,Amazon S3,Delta Lake,我正在尝试从S3存储桶加载所有传入的拼花文件,并使用delta lake处理它们。我有个例外 val df = spark.readStream().parquet("s3a://$bucketName/") df.select("unit") //filter data! .writeStream() .format("delta") .outputMode("append&

我正在尝试从S3存储桶加载所有传入的拼花文件,并使用delta lake处理它们。我有个例外

val df = spark.readStream().parquet("s3a://$bucketName/")

df.select("unit") //filter data!
        .writeStream()
        .format("delta")
        .outputMode("append")
        .option("checkpointLocation", checkpointFolder)
        .start(bucketProcessed) //output goes in another bucket
        .awaitTermination()
它抛出一个异常,因为“unit”是不明确的。

我试过调试它。出于某种原因,它会两次找到“单位”

这是怎么回事?这可能是编码问题吗

编辑: 以下是我创建spark会话的方式:

val spark = SparkSession.builder()
    .appName("streaming")
    .master("local")
    .config("spark.hadoop.fs.s3a.endpoint", endpoint)
    .config("spark.hadoop.fs.s3a.access.key", accessKey)
    .config("spark.hadoop.fs.s3a.secret.key", secretKey)
    .config("spark.hadoop.fs.s3a.path.style.access", true)
    .config("spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version", 2)
    .config("spark.hadoop.mapreduce.fileoutputcommitter.cleanup-failures.ignored", true)
    .config("spark.sql.caseSensitive", true)
    .config("spark.sql.streaming.schemaInference", true)
    .config("spark.sql.parquet.mergeSchema", true)
    .orCreate
编辑2: 来自df.printSchema()的输出


像这样读取相同的数据

val df = spark.readStream().parquet("s3a://$bucketName/*")

…解决了这个问题。不管什么原因。我很想知道为什么…:(

您可以尝试使用
spark.sql.caseSensitive=true
运行它吗?注意:不建议这样做,仅用于调试。但可能是拼花地板同时包含
单元
单元
列(拼花地板区分大小写)。另外,请指定您正在使用的Spark的版本。我刚刚试用过。它没有任何区别。“单位”和“单位”在我看来是一样的。两个较低的大写字母。spark版本:org.apache.spark:spark-sql_2.12:3.0.1你什么时候应用这个设置的?当然,在你的示例中它们是一样的,否则它们不会都通过过滤器。但是应该在创建会话时应用这个设置,在读取拼花地板之前。我已经添加了spark会话cedit.Spark会话中的创建代码创建是ofc发生的第一件事(在读取拼花地板之前)。之后,我不会更改配置。由于某些原因,您有两个同名列。现在我看到了您的配置,这可能是由于架构推断或架构合并。最好检查各个拼花的标题(您可以使用AWS S3 select查询单个对象),或禁用这些选项。使用
printSchema
获得一些见解也可能会有所帮助。
val df = spark.readStream().parquet("s3a://$bucketName/*")