当前位置: 首页 > 知识库问答 >
问题:

Parquet分区中同一列中不同类型的数据

晏华奥
2023-03-14

我从S3读取PARQUET文件时出错,原因是“final_height”列在同一个分区中有String和Double类型。供参考,拼花文件中有20多列。我得到的错误是:

ERROR 1: Failed merging schema of file ".../part1.gz.parquet":

ERROR 2: Caused by: org.apache.spark.SparkException:
Failed to merge fields 'final_height' and 'final_height'. Failed to merge incompatible data types double and string

ERROR 3: com.databricks.sql.io.FileReadException:
Error while reading file ".../part1.gz.parquet".
Parquet column cannot be converted. Column: [final_height], Expected: StringType, Found: DOUBLE

ERROR 4: com.databricks.sql.io.FileReadException:
Error while reading file ".../part1.gz.parquet".
Parquet column cannot be converted. Column: [final_height], Expected: DoubleType, Found: BINARY

ERROR 5: org.apache.spark.sql.execution.datasources.SchemaColumnConvertNotSupportedException

当"part1.gz.parquet"有X列的字符串数据,而"part2.gz.parquet"在同一列中有双精度数据时,找到了一些解决方案。但是当在同一分区中发现同一列中的不同类型时,它们不起作用。

试:

  • 使用合并模式和推断模式选项读取(得到错误1

希望有一些解决方案:)

谢啦!

共有1个答案

李烨烁
2023-03-14

理想的方法是将整个数据帧读取为二进制(数组[Byte])数据类型,然后将相应的值转换为其兼容的数据类型。然而,Spark不允许将双数据类型读取为二进制数据类型。因此无法继续采用这种方法。

一种方法是将Spark属性“Spark . SQL . files . ignorecoruperfiles”设置为true,然后读取具有所需模式的文件。与指定模式不匹配的文件将被忽略。结果数据集只包含与指定架构匹配的文件中的数据。因此读取两个数据帧,一个具有字符串数据类型,另一个具有双精度数据类型,然后将其中任何一个转换为单个数据类型,最后将它们联合。

val stringSchema = StructType(StructField("final_height", StringType, false) :: Nil)
val doubleSchema = StructType(StructField("final_height", DoubleType, false) :: Nil)

spark.conf.set("spark.sql.files.ignoreCorruptFiles", "true")

val stringDF = spark.read.schema(stringSchema).parquet("path/")
val doubleDF = spark.read.schema(doubleSchema).parquet("path/")
//Cast to compatible type
val doubleToStringDF = doubleDF.select(col("final_height").cast(StringType))

val finalDF = stringDF.union(doubleToStringDF)
 类似资料:
  • 问题内容: 在我试图基于y值为XY折线图/曲线的不同区域着色。我重写的 ,但我不知道它是如何处理 之间的线色小号,因为它只是让了(整数值)。 问题答案: 看起来线之间的着色的处理是在 线条颜色似乎基于先前的点 对您的修改使用渐变填充来混合线条颜色。 我已删除,因为我无权访问该类/方法。您可能需要修改以考虑 点之间的距离/渐变。

  • 问题内容: 我已经看到了一些类似的问题两种不同的类型如何使用接口在golang中实现相同的方法?,但就我而言,我的类型没有相同的基本类型。我的类型是不同大小的数组。 因此,可能不重复两种方法GetByte0()? 问题答案: 例如, 输出:

  • 在android中是否有区分不同类型的音频设备?例如,我从不同的制造商获得了音频设备类型A和音频设备类型B,这两种设备都使用音频插孔。每当用户插入音频设备类型A或类型B时,我想知道设备ID或名称、类型。我可以使用BroadcastRecencer检测音频设备的插入/输出。但无法获取设备ID或名称或类型。场景是:当音频设备类型A连接时,开启服务A,当音频设备类型B连接时,开启服务B。

  • 我有一个pandas数据框架,它有两列和<代码>类是二进制的。我想绘制一个直方图,并可视化列的不同容器上值的百分比。以下是我的尝试: 1-两个直方图,一个用于列的每个值: 2-将它们(类的两个值)放在一个图表中 从前两张图中可以看出,那些的行与另一个的行相比是罕见的,当我们把它们放在一起时(第三张图),我们看不到它们的效果(看看图表中那些小的橙色区域)。一种解决方案是使用每个箱子中的每个值的百分比

  • 我试图用不同的密钥将消息存储到不同的分区。 例如: 但是当我尝试运行我的Producer类时,它总是存储在单个分区中。 根据文档,使用查找分区。我还看到这个问题Kafka分区键工作不正常‏, 但我在Kafka Client库的0.9.x版本中找不到<code>ByteArrayPartitioner</code>类。 更新:我正在使用代码动态创建主题。 如果我手动创建一个带有分区的主题,那么它可以

  • 在C#中,我可以制作一个列表并向其添加不同类型的项。只要它们继承基类即可。例如: Rust不是面向对象编程语言,但我想知道是否可以实现类似的功能。有办法吗?