【问题标题】:Output of Spark DenseVector cast as StringTypeSpark DenseVector 的输出转换为 StringType
【发布时间】:2019-01-09 23:55:08
【问题描述】:

当 DenseVector 转换为 StringType 时,输出中的额外值是什么?

以下内容应该是可重现的。

spark = pyspark.sql.SparkSession.builder.getOrCreate()
spark.version

# u'2.2.0.cloudera1'

from pyspark.ml.linalg import DenseVector
import pyspark.sql.functions as F 
import pyspark.sql.types as T

testdf = spark.createDataFrame([\
            (DenseVector([2, 3]),),\
            (DenseVector([4, 5]),),\
            (DenseVector([6, 7]),)],\
            ['DenseVectors'])

testdf \
  .withColumn('DenseVector as String', F.col('DenseVectors')
  .cast(T.StringType())) \
  .show(truncate=False)

#+------------+----------------------------------------------------------+
#|DenseVectors|DenseVector as String                                     |
#+------------+----------------------------------------------------------+
#|[2.0,3.0]   |[6,1,0,0,2800000020,2,0,4000000000000000,4008000000000000]|
#|[4.0,5.0]   |[6,1,0,0,2800000020,2,0,4010000000000000,4014000000000000]|
#|[6.0,7.0]   |[6,1,0,0,2800000020,2,0,4018000000000000,401c000000000000]|
#+------------+----------------------------------------------------------+

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    这些不是额外的值。向量被实现为UserDefinedType(org.apache.spark.mllib.linalg.VectorUDT/org.apache.spark.ml.linalg.VectorUDT - 对于 Spark 2,您通常应该使用后者)并且没有有用的转换实现(如果有一个会很好,所以也许您可以打开一个JIRA ticket 如果没有)。

    您所看到的只是内部结构的反映,其中包含:

    • 类型编码为字节。
    • 向量稀疏时的长度。
    • 如果向量是稀疏的,则索引向量。
    • 值向量。

    并且不是为人类可读而设计的。

    要获得可读的输出,请使用udf

    @F.udf
    def to_string(v):
        return str(v)
    
    testdf.select(to_string("DenseVectors")).show()
    # +-----------------------+
    # |to_string(DenseVectors)|
    # +-----------------------+
    # |              [2.0,3.0]|
    # |              [4.0,5.0]|
    # |              [6.0,7.0]|
    # +-----------------------+
    

    【讨论】:

      猜你喜欢
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 2017-02-20
      • 2021-06-04
      • 1970-01-01
      • 2016-06-21
      • 2017-01-25
      相关资源
      最近更新 更多