如何解决Spark - 宽/稀疏数据帧持久性
我想保留一个非常宽的 Spark 数据帧(>100'000 列),该数据帧稀疏填充(>99% 的值为空),同时仅保留非空值(以避免存储成本):
- 这种用例的最佳格式是什么(HBase、Avro、Parquet 等)?
- 应该指定什么 Spark 端在写入时忽略空值?
请注意,我已经使用简单的 df.write statement
尝试了 Parquet 和 Avro - 对于大小为 ca 的 df。 100x130k Parquet 的性能最差(约 55MB),而 Avro(约 15MB)。对我来说,这表明存储了所有空值。
谢谢!
解决方法
Spark 到 JSON / SparseVector(来自 thebluephantom)
在 pyspark 中并使用 ml。否则转换为 Scala。
%python
from pyspark.sql.types import StructType,StructField,DoubleType
from pyspark.ml.linalg import SparseVector,VectorUDT
temp_rdd = sc.parallelize([
(0.0,SparseVector(4,{1: 1.0,3: 5.5})),(1.0,{0: -1.0,2: 0.5}))])
schema = StructType([
StructField("label",DoubleType(),False),StructField("features",VectorUDT(),False)
])
df = temp_rdd.toDF(schema)
df.printSchema()
df.write.json("/FileStore/V.json")
df2 = spark.read.schema(schema).json("/FileStore/V.json")
df2.show()
读取时返回:
+-----+--------------------+
|label| features|
+-----+--------------------+
| 1.0|(4,[0,2],[-1.0,0.5])|
| 0.0| (4,[1,3],[1.0,5.5])|
+-----+--------------------+
Spark 到 Avro / Avro2TF(来自 py-r)
this tutorial 中提供的 Avro2TF 库似乎是直接利用 Avro 的有趣替代方案。因此,稀疏向量将被编码如下:
+---------------------+--------------------+
|genreFeatures_indices|genreFeatures_values|
+---------------------+--------------------+
| [2,4,1,8,11]|[1.0,1.0,1...|
| [11,10,3]| [1.0,1.0]|
| [2,8]| [1.0,1.0]|
| [11,10]| [1.0,1.0]|
| [4,8]| [1.0,1.0]|
| [2,7,3]|[1.0,1.0]|
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。