主要翻译自 官网 pyspark 2.3.1 文档
https://spark.apache.org/docs/2.3.1/api/python/pyspark.html#pyspark.RDD
一 pyspark.RDD 保存hdfs文件
①saveAsHadoopDataset(conf, keyConverter=None, valueConverter=None)
输入RDD[(K,V)]形式数据,使用老的hadoop API接口存储在hdfs上数据;
内容需要被convert转化,默认转化器是 org.apache.spark.api.python.JavaToWritableConverter;
②saveAsHadoopFile(path, outputFormatClass, keyClass=None, valueClass=None, keyConverter=None, valueConverter=None, conf=None, compressionCodecClass=None)
输入RDD[(K,V)]形式数据,使用老的hadoop API接口存储在hdfs上数据;
不同于上面的是可以自行推断数据类型进行转换,也可以指定压缩模式;
③saveAsNewAPIHadoopDataset(conf, keyConverter=None, valueConverter=None)
相对亦①使用新的hadoop API接口
④saveAsNewAPIHadoopFile(path, outputFormatClass, keyClass=None, valueClass=None, keyConverter=None, valueConverter=None, conf=None)[source]
相对②使用新的hadoop API接口
⑤saveAsPickleFile(path, batchSize=10)
用pyspark.serializers.PickleSerializer序列化object对象,一次批默认10行
⑥saveAsSequenceFile(path, compressionCodecClass=None)
用org.apache.hadoop.io.Writable转化RDD的K/V
⑦saveAsTextFile(path, compressionCodecClass=None)
存为text文件,
compressionCodecClass可以使用:org.apache.hadoop.io.compress.GzipCodec
二 pyspark.sql.DataFrame.writer 保存hdfs文件
DataFrame.writer返回的是DataFrameWriter对象来进行写文件
①save(path=None, format=None, mode=None, partitionBy=None, **options)
df.write.format("parquet").mode('append').save(os.path.join(tempfile.mkdtemp(), 'data'))
本人推荐使用这种,想该模式,改写format参数即可,mode也可以改多种
缺点:传输的文件名只是个文件路径,不是单独一个文件,比如存为csv模式,去zeppelin的shell中查出需要使用
hdfs dfs -cat /tmp/spark/project/reults_1.csv/*
format : json、parquet、csv等
model:ovewriter重写、append文件末尾追加、error如果文件存在抛出异常、ignore如果文件存在忽略不更新
options
option:可是设置时区、时间等形式
partitionBy(*cols):可以按指定列去进行分区存储
df.write.partitionBy('year', 'month').parquet(os.path.join(tempfile.mkdtemp(), 'data'))
②csv(path, mode=None, compression=None, sep=None, quote=None, escape=None, header=None, nullValue=None, escapeQuotes=None, quoteAll=None, dateFormat=None, timestampFormat=None, ignoreLeadingWhiteSpace=None, ignoreTrailingWhiteSpace=None, charToEscapeQuoteEscaping=None)
df.write.mode("overwrite").csv(os.path.join(tempfile.mkdtemp(), 'data'))
df.write.mode("overwrite").csv(“/tmp/spark/project/result_1.csv”)
存为csv文件
③insertInto(tableName, overwrite=False)
存到dataFrame保存过的表中,
④jdbc(url, table, mode=None, properties=None)
通过jdbc存到表中,确保sparkContext、hiveContext、sqlContext等表之间可以互见,并且可以写入;
我记得由此能看到hive表,但是没法写进去。hive看不到spark中的表。
⑤json(path, mode=None, compression=None, dateFormat=None, timestampFormat=None)
df.write.json(os.path.join(tempfile.mkdtemp(), 'data'))
存为json文件
⑥orc(path, mode=None, partitionBy=None, compression=None)
orc_df = spark.read.orc('python/test_support/sql/orc_partitioned')
orc_df.write.orc(os.path.join(tempfile.mkdtemp(), 'data'))
文件通过orc序列化
⑦parquet(path, mode=None, partitionBy=None, compression=None)
df.write.parquet(os.path.join(tempfile.mkdtemp(), 'data'))
存为parquet文件
⑧text(path, compression=None)
存为text文件
⑨saveAsTable(name, format=None, mode=None, partitionBy=None, **options)
存成表结构,一般用于hiveContext与hive表结构连接存储;
bucketBy(numBuckets, col, *cols)[source]:按指定列分成多少块存储,用于saveAsTable
df.write.format('parquet').bucketBy(100, 'year', 'month').mode("overwrite").saveAsTable('bucketed_table')
sortBy(col, *cols) 按指定列排序与bucket使用
df.write.format('parquet').bucketBy(100, 'year', 'month').sortBy('day').mode("overwrite").saveAsTable('sorted_bucketed_table')