关于spark以parquet写入时的小问题

本文描述了在使用Spark对DataFrame进行GroupBy操作时遇到的错误,并详细记录了解决过程。通过重命名带有括号的列名,成功避免了在将数据写入HDFS时出现的AnalysisException。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天使用spark对一个dataframe中的数据以某一个为主键做groupby进行求和,数据类似如下:

scala> userDF.show
+---------+--------+
| userid | count |
+--------+---------+
| 11111111|  102|
| 2222222|    97|
| 3333333|    10|
| 11111111|    24|
+----------+-------+

scala> val dataFrame = userDF.groupBy("userid").sum("count")
dataFrame: org.apache.spark.sql.DataFrame = [uid: string, sum(count): bigint]

scala>dataFrame.repartition(5).write.mode(SaveMode.Overwrite).parquet("hdfs://xxx.xxx.xxx.xxx:8020/userdata/userdata_20181017")

结果出错了,报了下面的错(org.apache.spark.sql.AnalysisException: Attribute name "xxxxx" contains invalid character(s) among ",;{}()\n\t=".):

想来想去,dataframe的数据没问题,根据报错分析下,提示有特殊字符,那在dataframe的表头仅有“sum(count)”,这里面包含有括号,于是想着对dataframe表头进行重命名,代码如下:

scala> val dataFrame = userDF.groupBy("userid").sum("count").toDF("userid", "count")
dataFrame: org.apache.spark.sql.DataFrame = [uid: string, sum(count): bigint]

scala>dataFrame.repartition(5).write.mode(SaveMode.Overwrite).parquet("hdfs://xxx.xxx.xxx.xxx:8020/userdata/userdata_20181017")

结果数据能正确写到hdfs上了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值