spark-wide/sparseDataframe持久性

fsi0uk1n  于 2021-07-13  发布在  Hbase
关注(0)|答案(1)|浏览(439)

我想保留一个非常宽的sparkDataframe(>100000列),它是稀疏填充的(>99%的值为null),同时只保留非null值(以避免存储成本):
这种用例的最佳格式是什么(hbase、avro、parquet等)?
在写入时,应该指定什么来忽略空值?
请注意,我已经尝试了Parquet和avro与一个简单的 df.write statement -对于大小约为100x130k的df,parquet的性能最差(约55mb),而avro的性能最差(约15mb)。对我来说,这意味着所有的空值都被存储。
谢谢!

23c0lvtd

23c0lvtd1#

spark到json/sparsevector(来自bluephantom)
在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]|

相关问题