【问题标题】:Spark - Wide/sparse dataframe persistenceSpark - 宽/稀疏数据帧持久性
【发布时间】:2021-04-14 23:42:13
【问题描述】:

我想保留一个非常宽的 Spark Dataframe(>100'000 列),该数据帧是稀疏填充的(>99% 的值为空),同时只保留非空值(以避免存储成本):

  • 此类用例(HBase、Avro、Parquet 等)的最佳格式是什么?
  • Spark 端写入时应该指定什么来忽略空值?

请注意,我已经使用简单的df.write statement 尝试了 Parquet 和 Avro - df 大小为 ca。 100x130k Parquet 与 Avro(约 15MB)相比表现最差(约 55MB)。对我来说,这表明存储了所有空值。

谢谢!

【问题讨论】:

  • 稀疏向量呢?
  • @thebluephantom:感谢您的建议。知道如何persist 稀疏向量吗?

标签: apache-spark hbase parquet google-cloud-bigtable spark-avro


【解决方案1】:

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, SparseVector(4, {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.0, 1...|
|          [11, 10, 3]|     [1.0, 1.0, 1.0]|
|            [2, 4, 8]|     [1.0, 1.0, 1.0]|
|             [11, 10]|          [1.0, 1.0]|
|               [4, 8]|          [1.0, 1.0]|
|         [2, 4, 7, 3]|[1.0, 1.0, 1.0, 1.0]|

【讨论】:

  • 谢谢 - 这是一个真正的稀疏格式!你知道是否有可能在 Avro/Parquet 中获得一些类似的结构,包括。元数据? HBase 呢?事实上,我也希望在查询时有效;)谢谢!
  • avro 和 parquet 是截然相反的。一个是行的,一个是柱状的。备用格式的整个想法是节省空间。
  • 谢谢,但您是说 be definition Avro 或 Parquet 不支持任何稀疏结构,即必须存储所有空值? HBase 呢?
  • 如果您有密钥,则 JSON 没有问题,除非您想直接访问。密集向量到 avro 的数组,但不是稀疏的。
  • sparse 更适合内存机器学习。
猜你喜欢
  • 2021-04-15
  • 2017-08-30
  • 2022-12-17
  • 2016-01-26
  • 2021-03-07
  • 2021-11-02
  • 2016-09-09
  • 2018-04-28
  • 1970-01-01
相关资源
最近更新 更多