微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spark - 宽/稀疏数据帧持久性

如何解决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 举报,一经查实,本站将立刻删除。