【spark】五 RDD、DataFrame.write 存储API的使用与区别

主要翻译自 官网 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')

你可能感兴趣的:(spark)