【发布时间】:2016-12-05 10:28:13
【问题描述】:
我正在尝试了解 DataFrame 列类型。当然,DataFrame 不是物化对象,它只是 Spark 的一组指令,将来要转换成代码。但我想象这个类型列表代表了在执行操作时可能在 JVM 中实现的对象类型。
import pyspark
import pyspark.sql.types as T
import pyspark.sql.functions as F
data = [0, 3, 0, 4]
d = {}
d['DenseVector'] = pyspark.ml.linalg.DenseVector(data)
d['old_DenseVector'] = pyspark.mllib.linalg.DenseVector(data)
d['SparseVector'] = pyspark.ml.linalg.SparseVector(4, dict(enumerate(data)))
d['old_SparseVector'] = pyspark.mllib.linalg.SparseVector(4, dict(enumerate(data)))
df = spark.createDataFrame([d])
df.printSchema()
四个向量值的列在printSchema()(或schema)中看起来相同:
root
|-- DenseVector: vector (nullable = true)
|-- SparseVector: vector (nullable = true)
|-- old_DenseVector: vector (nullable = true)
|-- old_SparseVector: vector (nullable = true)
但是当我逐行检索它们时,它们结果是不同的:
> for x in df.first().asDict().items():
print(x[0], type(x[1]))
(2) Spark Jobs
old_SparseVector <class 'pyspark.mllib.linalg.SparseVector'>
SparseVector <class 'pyspark.ml.linalg.SparseVector'>
old_DenseVector <class 'pyspark.mllib.linalg.DenseVector'>
DenseVector <class 'pyspark.ml.linalg.DenseVector'>
我对@987654327@ 类型的含义感到困惑(相当于VectorUDT 用于编写UDF)。 DataFrame 如何知道它在每个 vector 列中具有四种向量类型中的哪一种?这些向量列中的数据是否存储在 JVM 或 python VM 中?如果VectorUDT不是listed here的官方类型之一,为什么VectorUDT可以存储在DataFrame中?
(我知道mllib.linalg 中的四种向量类型中的两种最终将被弃用。)
【问题讨论】:
标签: apache-spark dataframe pyspark apache-spark-mllib apache-spark-ml