Apache spark Spark-宽/稀疏数据帧持久性
我希望保留一个非常宽的Spark数据帧(>100000列),该数据帧填充稀疏(>99%的值为null),同时只保留非null值(以避免存储成本):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
- 这种用例(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的原因。