Spark - Wide/sparse 数据帧持久性
Spark - Wide/sparse dataframe persistence
我想保留一个非常宽的 Spark Dataframe(>100'000 列),该数据帧稀疏填充(>99% 的值为空),同时仅保留非空值(以避免存储成本):
- 这种用例(HBase、Avro、Parquet 等)的最佳格式是什么?
- Spark端在写的时候要忽略null需要指定什么?
请注意,我已经用简单的 df.write statement
尝试过 Parquet 和 Avro - 对于大小为 ca 的 df。 100x130k Parquet 表现最差(约 55MB)与 Avro(约 15MB)相比。对我来说,这表明存储了所有空值。
谢谢!
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()
returns 阅读后:
+-----+--------------------+
|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]|
我想保留一个非常宽的 Spark Dataframe(>100'000 列),该数据帧稀疏填充(>99% 的值为空),同时仅保留非空值(以避免存储成本):
- 这种用例(HBase、Avro、Parquet 等)的最佳格式是什么?
- Spark端在写的时候要忽略null需要指定什么?
请注意,我已经用简单的 df.write statement
尝试过 Parquet 和 Avro - 对于大小为 ca 的 df。 100x130k Parquet 表现最差(约 55MB)与 Avro(约 15MB)相比。对我来说,这表明存储了所有空值。
谢谢!
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()
returns 阅读后:
+-----+--------------------+
|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]|