【问题标题】:Is it possible to store a numpy array in a Spark Dataframe Column?是否可以在 Spark Dataframe 列中存储一个 numpy 数组?
【发布时间】:2017-12-11 10:56:34
【问题描述】:

我有一个dataframe,我对它应用了一个函数。这个函数返回一个numpy array,代码如下:

create_vector_udf = udf(create_vector, ArrayType(FloatType()))
dataframe = dataframe.withColumn('vector', create_vector_udf('text'))
dmoz_spark_df.select('lang','url','vector').show(20)

现在spark似乎对此并不满意,不接受ArrayType(FloatType()) 我收到以下错误消息: net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.core.multiarray._reconstruct)

我可以只使用numpyarray.tolist() 并返回它的列表版本,但显然如果我想将它与numpy 一起使用,我总是必须重新创建array

那么有没有办法将numpy array 存储在dataframe column 中?

【问题讨论】:

标签: numpy pyspark spark-dataframe


【解决方案1】:

问题的根源在于从 UDF 返回的对象不符合声明的类型。 create_vector 不仅必须返回numpy.ndarray,而且必须将数字转换为与 DataFrame API 不兼容的相应 NumPy 类型。

唯一的选择是使用这样的东西:

udf(lambda x: create_vector(x).tolist(), ArrayType(FloatType()))

【讨论】:

    【解决方案2】:

    一种方法是将 DataFrame 中 numpy 数组的每一行转换为整数列表。

    df.col_2 = df.col_2.map(lambda x: [int(e) for e in x])
    

    然后,直接转成Spark DataFrame

    df_spark = spark.createDataFrame(df)
    df_spark.select('col_1', explode(col('col_2')).alias('col_2')).show(14)
    

    【讨论】:

      猜你喜欢
      • 2022-07-21
      • 2014-04-30
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2021-11-16
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多