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)
拜拜,
愿我們終有重逢之時,而你還記得我們曾經討論的話題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/253062.html
標籤:其他
