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



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

  • 这种用例(HBase、Avro、Parquet…(的最佳格式是什么
  • 写入时应该指定什么样的Spark端来忽略null

注意,我已经用一个简单的df.write statement尝试过Parquet和Avro,尺寸为ca。100x130k Parquet的表现最差(ca。55MB(,而Avro(ca。15MB(。对我来说,这意味着所有的空值都被存储了。

谢谢!

Spark-to-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])|
+-----+--------------------+

Spark到Avro/Avro2TF(从py-r(

本教程中介绍的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]|

最新更新