楓尘君一直觉得将df存为csv文件是一个非常简单操作处理,但是当查阅资料之后发现网上有很多误导和错误,本着从实际出发的原则,记录一下过程:
1. 发现问题
背景:楓尘君想利用spark处理较大的数据集,然后用python将提取特征后的数据集建模
用spark将数据筛选后生成dataframe类型的表: data
于是从网上查看了一下将data表转化为csv文件的方法,于是我发现:
来自:http://cn.voidcc.com/question/p-wygpwrof-boe.html
来自:https://ask.helplib.com/csv/post_12540297
来自:https://codeday.me/bug/20181226/467736.html
这是我google “spark dateframe存为csv” 的前三条答案
发现问题了吗?
***csv()方法里是否需要在末尾加入.csv***三条回答有两种不同的答案,想要探求问题本质的本君去查阅了一下源码:
源码地址:点击这里
发现csv()方法如下:
调用了save()方法,并且没有例子,于是不放弃的我又找到了save()方法源码:
还是一无所获,于是乎我要自己找个例子测试一下:
部分代码如下
val spark = SparkSession.builder()
.appName("demo").getOrCreate()
import spark.implicits._
var data = Seq(
("10", "ming", "hlj","2019-09-06 10:15:15", "1"),
("9", "tian", "jl","2019-09-07 14:15:15", "1"),
("8", "ming", "jl","2019-09-07 16:15:15", "1"),
("7", "sun", "ln","2019-09-07 16:15:15", "1"),
("10000", "ke", null,"2019-09-07 21:01:01", null),
("4", "ke", "hlj","2019-09-07 20:15:15", null),
(null, "ke", "hlj","2019-09-07 10:15:15", "1"),
(null, "ke", "hlj","2019-09-08 01:15:15", "1"),
("6", "ming", "ln","2019-09-08 05:15:15", "1"),
("5", "tian", "jl","2019-09-08 13:15:15", "1"),
("4", "tian", "hlj","2019-09-08 19:15:15", "1"),
("2", "sun", "tj","2019-09-08 15:15:15", "1")
).toDF("CST_NO", "name", "live","START_TIME", "freq")
data.show()
data.coalesce(1).write.mode(SaveMode.Overwrite).option("header","true").option("sep","#").csv("rerr")
data.coalesce(1).write.mode(SaveMode.Overwrite).option("header","true").option("sep","#").csv("ressssssss")
println("存入完成!!!!!!!!!!")
spark.close()
当我运行完代码才发现,我存入的路径不是我的本地路径,而是hdfs路径,但是也没关系:
hdfs dfs -ls
查看hdfs目录发现:
果然出现两条,到底是文件还是文件夹呢?
hdfs dfs -ls ressssssss.csv
得出结论 :ressssssss.csv是一个文件夹,文件夹下有两个文件,其中一个是csv文件,所以 csv()方法结尾不需要加.csv
注:
- 1.想让csv文件存入服务器物理机上,需要先进入hdfs找到该文件,再复制到物理机上:
如:
hdfs dfs -get rerr/part-00000-26efe559-5bca-454a-9250-d7759e953a53-c000.csv /home/xas/lq
rerr/part-00000-26efe559-5bca-454a-9250-d7759e953a53-c000.csv 是hdfs文件的路径
/home/xas/lq 是物理机路径下文件夹
- 2.hdfs指令 参考链接
从服务器物理机查看文件命令为:
hdfs dfs -ls
查看文件内容命令为:
hadf dfs -cat rerr/part-00000-b29df28f-2a85-47bf-8559-f8cf6cc25a2b-c000.csv
- 3.spark想直接从服务器中读取csv
输入路径最好是hdfs路径而不是物理机路径 亲测有可能不会被识别,暂时没有找到解决办法,还是先从物理机复制到hdfs中再引用hdfs地址,更加高效靠谱… 希望大家注意(本人被物理路径折腾了2个小时,最后还是转到hdfs中解决了,心塞。。。。)
经过楓尘君的一顿瞎折腾,相信小伙伴们不会对于csv()方法的疑惑啦啦啦~~~