pySpark学习笔记N——数据的存储

hi各位大佬早啊。我是菜鸟小明哥。在下载用户及item特征的时候出现问题,spark.sql得到的数据已经是dataframe了,但是我用.withColumn增加列后选择了分user或item存储在hdfs,这是种分片存储的方式(不知道我说的啥,详见下面代码吧),但这种就会出现问题:选择的列如果是空值的话,那么它不会以NULL的形式出现在hadoop getmerge的本地结果中,这就出现了有的行是13个特征,有的是14个特征,如下:照搬照抄是不行的,有坑。

For Recommendation in Deep learning QQ Group 102948747

For Visual in deep learning QQ Group 629530787

I'm here waiting for you

不接受CSDN网页的私聊/私信!!!

df= spark.sql(mycmd)
df = df.withColumn('uid', F.concat_ws(';;', df['uid'], df['n'], df['t'], df['c'], df['v'], .....))
df.select('uid').write.text(path=save_path)
#path是hdfs的地址

从hdfs下拉数据采用的一句话:

hadoop fs -getmerge hdfs_path local_path/local_file.txt

我从不相信有啥高科技,只是有些东西你不知道而已,复制粘贴还能有创造性???唯一谈得上是创新的就是自己从坑中爬出来

本文说的就是local_file的特征数问题,有些是13,有些是14个,说明有空值存在,而在withColumn时并没有特殊处理,或者说采用了;;分割,至于为啥采用;;分割,因为特征中可能有'\t',','符号了,这样分割肯定出错。如果已经清楚知道特征中没有前述符号,那么可以直接用','分割,这种情况下是没有问题的,空值是啥都没有,但会多一个分割号',',这样采用pd或者csv解析时不会出错,否则就是我遇到的问题了。当然如果采用直接hive -e的下载方式不会出现这种问题,因为会自动补NULL,分割默认为'\t',这是OK的,但这种方法有点Low,上不了台面,恐难令interviewer信服你的tech有多NB。

因为我知道user及item特征中有逗号出现,所以不能用逗号分割了,否则报错,如下:另外也有#,|,; , :了,我试试&分割吧,最好采用单个字符,这样比较好解析

Skipping line 577365: ',' expected after '"'
Skipping line 577366: ',' expected after '"'
Skipping line 577367: ',' expected after '"'
Skipping line 577368: ',' expected after '"'
Skipping line 577369: ',' expected after '"'

然而也是不行,卧槽,我试试感叹号及@吧,单个符号分割咋就不行了,谁写的特征,WOC,我要是leader就开了他,你把所有的符号都用上了,我没得用了。

感叹号我看了没啥毛病,但就是有问题,说遇到了空值,而实际上并没有发现啊。按照提示改下试试,

Skipping line 1895996: NULL byte detected. This byte cannot be processed in Python's native csv library at the moment, so please pass in engine='c' instead
Skipping line 1896373: NULL byte detected. This byte cannot be processed in Python's native csv library at the moment, so please pass in engine='c' instead
Skipping line 1896676: NULL byte detected. This byte cannot be processed in Python's native csv library at the moment, so please pass in engine='c' instead

已经再次试错了:当采用感叹号时结果仍旧是13和14个特征的问题,这说明空值在withColumn下是不能使用的,遂果断放弃这种。另外也麻烦,还要写出每个列的名字,费劲。

所以本菜鸟的最终解决方案是,将这些去掉即可,,,,,,,,,,想不到吧,跳出这个坑了。我是被前人写的代码坑了,MD

我原以为空值的部分没有补充,而出现第一个报错(最上),后来发现这种错是分隔符旁边有"这种符号。只需参考这里即可解决。但空值是否有补充,来反推一下吧,总的行数以及读取后的行数对比如下:即使存在这种空值而实际没有补充的情况,那么我也可大胆的忽略这行的数据,毕竟占比很少。

1900257 user_profile.txt
>>> udf.shape
(1900145, 11)

6976805 item_profile.txt
(6976803, 14)

4176635 click_log.txt
(4176633, 6)

拜拜。

愿我们终有重逢之时,而你还记得我们曾经讨论的话题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章