我们使用sqoop作为文本文件格式将数据从源rdbms系统导入hadoop环境。这个文本文件需要加载到Parquet格式的配置单元表中。我们如何在不使用hive支持(之前我们使用beeline insert,现在我们设计不再使用hive)和使用parquet直接写入hdfs的情况下实现这个场景。
例如:-在sqoop导入之后,假设我们在hdfs target dir下有一个文件/数据/loc/mydb/mytable
mytable和all中的数据都是string类型。
-----------------------------------------
10|customer1|10.0|2016-09-07 08:38:00.0
20|customer2|20.0|2016-09-08 10:45:00.0
30|customer3|30.0|2016-09-10 03:26:00.0
------------------------------------------
目标配置单元表架构。
rec_id: int
rec_name: String
rec_value: Decimal(2,1)
rec_created: Timestamp
如何使用spark和动态管理所有列的类型转换,将数据从mytable加载到目标底层配置单元表位置(parquet格式)。
请注意:这里不能使用hivecontext。在此方法中的任何帮助都是非常感谢的。提前谢谢。
1条答案
按热度按时间2mbi3lxu1#
下面的例子是
.csv
文件的格式与问题中的格式相同。我想先解释一些细节。
在“表架构”字段中:
rec_value: Decimal(2,1)
一定会的rec_value: Decimal(3,1)
原因如下:这个
DECIMAL
类型表示具有固定值的数字precision
以及scale
. 当您创建DECIMAL
列中,指定precision
、p和scale
,s。Precision
是总位数,与小数点的位置无关。Scale
小数点后的位数。为了在不损失精度的情况下表示数字10.0,您需要DECIMAL
键入precision
至少3个,以及scale
至少为1。所以
Hive
表将是:完整的scala代码
输入文件为
.csv
制表符分隔字段阅读
Spark
```+------+---------+---------+-------------------+
|rec_id|rec_name |rec_value|rec_created |
+------+---------+---------+-------------------+
|10 |customer1|10.0 |2016-09-07 08:38:00|
|20 |customer2|24.0 |2016-09-08 10:45:00|
|30 |customer3|35.0 |2016-09-10 03:26:00|
|40 |customer1|46.0 |2016-09-11 08:38:00|
......
root
|-- rec_id: integer (nullable = true)
|-- rec_name: string (nullable = true)
|-- rec_value: decimal(3,1) (nullable = true)
|-- rec_created: timestamp (nullable = true)
希望这有帮助。