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)

拜拜。

願我們終有重逢之時,而你還記得我們曾經討論的話題。

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