gpt4 book ai didi

apache-spark - Spark DataFrame 如何区分不同的 VectorUDT 对象?

转载 作者:行者123 更新时间:2023-12-04 04:13:02 24 4
gpt4 key购买 nike

我正在尝试了解 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 的含义感到困惑类型(相当于 VectorUDT 用于编写 UDF)。 DataFrame 如何知道它在每个 vector 中具有四种向量类型中的哪一种柱子?这些向量列中的数据是存储在 JVM 还是 python VM 中?怎么会 VectorUDT可以存储在 DataFrame , 如果它不是官方类型之一 listed here ?

(我知道 mllib.linalg 的四种向量类型中的两种最终将被弃用。)

最佳答案

how come VectorUDT can be stored in the DataFrame


UDT a.k.a 用户定义类型应该是这里的提示。 Spark 提供(现在是私有(private)的)机制来存储自定义对象到 DataFrame .您可以查看我对 How to define schema for custom type in Spark SQL? 的回答或 Spark 源以获得详细信息,但长话短说,它都是关于解构对象并将它们编码为 Catalyst 类型。

I'm confused about the meaning of vector type



很可能是因为你看错了东西。简短的描述很有用,但它不能确定类型。相反,您应该检查架构。让我们创建另一个数据框:

import pyspark.mllib.linalg as mllib
import pyspark.ml.linalg as ml

df = sc.parallelize([
(mllib.DenseVector([1, ]), ml.DenseVector([1, ])),
(mllib.SparseVector(1, [0, ], [1, ]), ml.SparseVector(1, [0, ], [1, ]))
]).toDF(["mllib_v", "ml_v"])

df.show()

## +-------------+-------------+
## | mllib_v| ml_v|
## +-------------+-------------+
## | [1.0]| [1.0]|
## |(1,[0],[1.0])|(1,[0],[1.0])|
## +-------------+-------------+

并检查数据类型:

{s.name: type(s.dataType) for s in df.schema}

## {'ml_v': pyspark.ml.linalg.VectorUDT,
## 'mllib_v': pyspark.mllib.linalg.VectorUDT}

如您所见,UDT 类型是完全限定的,因此这里没有混淆。

How does the DataFrame know which of the four vector types it has in each vector column?



如上图 DataFrame只知道它的模式并且可以区分 ml/ mllib类型,但不关心向量变体(稀疏或密集)。

向量类型由其 type 决定字段( byte 字段,0 -> 稀疏,1 -> 密集),但总体架构是相同的。 ml 之间的内部表示也没有区别。和 mllib .

Is the data in those vector columns stored in the JVM or in Python


DataFrame是一个纯 JVM 实体。 Python 互操作性是通过耦合的 UDT 类实现的:
  • Scala UDT 可以定义 pyUDT属性。
  • Python UDT 可以定义 scalaUDT属性。
  • 关于apache-spark - Spark DataFrame 如何区分不同的 VectorUDT 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38680252/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com