apache-spark - Spark(v 2.3.2)数据帧正在以字符串类型读取 ORC 文件中的所有列。这是正常行为吗?

标签 apache-spark orc

我有一堆 CSV 文件,正在使用 ETL 工具 Informatica 以 ORC 格式加载到 HDFS 中。加载到 HDFS 后,我想提取 ORC 文件的元数据(列名称、数据类型)。

但是当我将 ORC 文件加载到 Spark 数据帧中时,所有列都被评估为 string 类型。

示例数据:

ID|Course|Enrol_Date|Credits
123|Biology|21-03-2012 07:34:56|24
908|Linguistics|05-02-2012 11:02:36|15
564|Computer Science|18-03-2012 09:48:09|30
341|Philosophy|23-01-2012 18:12:44|10
487|Math|10-04-2012 17:00:46|20

我使用以下命令来实现此目的:

df = sqlContext.sql("SELECT * FROM orc.`<HDFS_path>`");
df.printSchema()

示例输出:

root
 |-- ID: string (nullable = true)
 |-- Course: string (nullable = true)
 |-- Enrol_Date: string (nullable = true)
 |-- Credits: string (nullable = true)

我对 Spark 和 HDFS 完全陌生。我试图理解为什么每一列都是 string 类型的结果。这是使用 csv 源文件创建 ORC 时的正常行为(无论我们使用哪种工具来执行此操作)?或者我在 Spark 中没有正确执行某些操作导致了这种情况?

最佳答案

默认情况下,spark 将所有字段读取为 StringType 。您可以尝试以下方法:

为了推断架构,

val data = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("<path>.csv")

用于提供自定义架构

import org.apache.spark.sql.types._

val customSchema = StructType(Array(
  StructField("col1", StringType, true),
  StructField("col2", IntegerType, true),
  StructField("col3", DoubleType, true))
)

val data = spark.read.format("csv").option("header", "true").schema(customSchema).load("<path>.csv")

关于apache-spark - Spark(v 2.3.2)数据帧正在以字符串类型读取 ORC 文件中的所有列。这是正常行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58409031/

相关文章:

apache-spark - 如何优化将 150GB 数据加载到配置单元表中?

java - 为什么H2O通过Spark而不是直接集成TensorFlow?

apache-spark - Spark - X 毫秒后执行器心跳超时

scala - Spark Scala UDF 参数限制为 10

apache-spark - 如何使用 usingColumns 连接 spark 中的嵌套列

python - 使用 PySpark 读取 .ORC 文件时,即使明确指定,也会丢失 header

hadoop - 是否会在 ORC 文件中读取所有嵌套列?

scala - Spark Filter/Predicate Pushdown 是否在 ORC 文件中没有按预期工作?

hadoop - 从ORC读取时增加映射器的数量