我有一堆 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/