首页 > 解决方案 > 将 CSV 支持的数据帧转换为配置单元表会失去多行支持

问题描述

我有一个包含名称和长格式消息数据的 CSV 文件。消息数据采用多行格式,数据中嵌入了换行符。这些字段已被引用,我已成功将其解析为 Spark 数据帧,如下所示:

scala> val df =spark.read.option("parserLib", "univocity")
.option("multiLine", true)
.option("header", true)
.option("inferSchema", true)
.option("quoteAll", true)
.csv("/data.csv");
df: org.apache.spark.sql.DataFrame = [Name: string, Message: string ... 17 more fields]

这会在Name列中生成预期数据:

scala> df.limit(10).select("Name").show
+-------+
|   Name|
+-------+
| foobar|
| foobar|
| foobar|
| foobar|
| foobar|
| foobar|
| foobar|
| foobar|
| foobar|
| foobar|
+-------+

当我尝试将其转换为配置单元表时会出现问题:

scala> df.createOrReplaceTempView("events")
scala> sqlContext.sql("create table s_events as select * from events");
res52: org.apache.spark.sql.DataFrame = []

现在显示数据表明 CSV 解析器不再转义嵌入的换行符,而是将它们解析为行分隔符:

scala> sqlContext.sql("select Name from s_events limit 10").show();
+--------------------+
|                Name|
+--------------------+
|              foobar|
|              foobar|
|              foobar|
|              foobar|
|              foobar|
|Sent: Tuesday, 30...|
|To: 'personxyz   ...|
|Subject: RE: ABSD...|
|                    |
|     Hello Person,  |
+--------------------+

以前,我尝试过直接在 Hive 中加载,但 Hive 的结果相同。一些谷歌搜索告诉我,Hive 不支持 CSV 中的多行记录的解决方法是如上所述通过 Spark 侧加载,但这似乎也不起作用。

有没有办法让 Hive 相信引用区域中的换行符现在是行分隔符,或者我是否需要在尝试加载数据之前清理数据?

标签: sqlscalacsvapache-sparkhive

解决方案


推荐阅读