Spark将dataframe存为csv文件

56 篇文章 4 订阅
27 篇文章 0 订阅

楓尘君一直觉得将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()方法的疑惑啦啦啦~~~

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值