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

Apache spark Spark-宽/稀疏数据帧持久性,apache-spark,hbase,parquet,google-cloud-bigtable,spark-avro,Apache Spark,Hbase,Parquet,Google Cloud Bigtable,Spark Avro,我希望保留一个非常宽的Spark数据帧(>100000列),该数据帧填充稀疏(>99%的值为null),同时只保留非null值(以避免存储成本): 这种用例(HBase、Avro、拼花地板等)的最佳格式是什么 在写入时,应指定什么样的火花侧以忽略空值 请注意,我已经用一个简单的df.write语句尝试了拼花地板和Avro。对于尺寸约为100x130k的df,与Avro(约15MB)相比,拼花地板的性能最差(约55MB)。对我来说,这意味着存储了所有空值 谢谢 Spark到JSON/Spars

我希望保留一个非常宽的Spark数据帧(>100000列),该数据帧填充稀疏(>99%的值为null),同时只保留非null值(以避免存储成本):

  • 这种用例(HBase、Avro、拼花地板等)的最佳格式是什么
  • 在写入时,应指定什么样的火花侧以忽略空值
请注意,我已经用一个简单的
df.write语句尝试了拼花地板和Avro。对于尺寸约为100x130k的df,与Avro(约15MB)相比,拼花地板的性能最差(约55MB)。对我来说,这意味着存储了所有空值


谢谢

Spark到JSON/SparseVector(来自)

在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])|
+-----+--------------------+
火花到Avro/Avro2TF(从)

中介绍的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/拼花地板中获得类似的结构,包括元数据?HBase呢?事实上,我也希望在查询时有效;)谢谢avro和拼花地板截然相反。一个是行,一个是列。备用格式的整个想法是为了节省空间。谢谢,但你是说be definition Avro或Parquet不支持任何稀疏结构,即必须存储所有空值?HBase呢?如果您有密钥,那么就看不到JSON的问题,除非您想要直接访问。avro的密集向量到数组,但不是稀疏的。这就是我建议使用json的原因。