sql - 将 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 相信引用区域中的换行符现在是行分隔符,或者我是否需要在尝试加载数据之前清理数据?
解决方案
推荐阅读
- python - 为另一个类中的小部件设置背景图像
- python - NameError:名称'urllib'未定义TypeError:'module'对象不可调用
- python - VScode 内部人员智能感知
- salesforce - 我组织中的一位用户没有角色,我无法编辑他的记录
- rest - CF11 与 CF2018 REST 404 响应
- python - 为什么将张量对象更改为 tf.constant 有效
- java - 单元测试生成器对象的最佳实践?
- node.js - 如何使用 Typescript Express App 渲染 Lit Element Web 组件?
- scala - 如何将共享测试与需要清理的固定装置结合起来?
- mysql - JOIN 或 LEFT JOIN 是否继续检查 SELECT 查询?