pyspark 操作写csv(简易版)
df = spark.sql("select * from test limit 10")
df.write.csv("/data01/uxj/jupyter/test/res/")
这种最简朴的方式 会存在两个小问题:
1、没有列名(header)
2、写本地文件的话此时是个目录,会在目录下创建XXXXX.csv
稍加修饰完成对第一个问题的处理 添加 option("header","true")
pandas 写csv
df = spark.sql("select * from test limit 10")
df.toPandas().to_csv("/data01/uxj/jupyter/test/res/test2.csv")
可以直接转化,由spark DataFrame转pandas DateFrame 然后执行to_csv()
这类本地可以直接生成作者想要的文件名,如test2.csv
但是可能会有一类错误产生
Can only use .dt accessor with datetimelike values
为何呢?????
原因:
pyspark的datetime格式无法与pandas的时间类型格式datetime直接对应
可以查看一下pyspark中的数据类型
df.printSchema()
root
|-- u_id: string (nullable = true)
|-- pid: integer (nullable = true)
|-- push_date: date (nullable = true)
|-- visit_date: date (nullable = true)
对的!你会发现他确实有date类型的
此时有两种解决方法:
1、在sql中直接将date类型的数据转string
df = spark.sql('''
select
u_id,
pid,
date_format(push_date,'yyyy-MM-dd') as push_date,
date_format(visit_date,'yyyy-MM-dd') as visit_date
from
suanfa_new
''')
当然这种局限于已知列名,和对应的数据类型
2、遍历获取对应的列的类型 然后修改成时间戳
from pyspark.sql.functions import to_timestamp
for f in [f[0] for f in df.dtypes if f[1]=='date']:
df = df.withColumn(f, F.to_timestamp(F.col(f), 'yyyy-MM-dd'))
这一类的可以不用知晓多少列,自己去处理,机器处理就好了
当然,如果遇到很多列的数据,需要大量的转化,那么可以直接使用spark.write.option("header","true").csv("/test/")