我正在尝试理解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'>
我对“vector”类型的含义感到困惑(在编写UDF时等同于“VectorUDT”)。DataFrame如何知道每个向量列中有哪四种向量类型?这些向量列中的数据是存储在JVM还是python VM中的?如果它不是此处列出的官方类型之一,那么为什么“VectorUDT”可以存储在DataFrame中呢?
(我知道来自“mllib.linalg”的四种向量类型中有两种最终将被弃用。)
print(df.schema)
,但是VectorUDT
实例的字符串表示不包括完整的限定符,我没有考虑直接检查它们的类。我只是对一些奇怪的魔法感到不舒服,但现在一切都看起来合理了。 - max