【发布时间】:2019-04-08 22:14:27
【问题描述】:
我想将向量列展开为数据框中的普通列。 .transform 创建单独的列,但是当我尝试 .show 时,数据类型或“可为空”出现错误 - 请参阅下面的示例代码。如何解决问题?
from pyspark.sql.types import *
from pyspark.ml.feature import VectorAssembler
from pyspark.sql.functions import udf
spark = SparkSession\
.builder\
.config("spark.driver.maxResultSize", "40g") \
.config('spark.sql.shuffle.partitions', '2001') \
.getOrCreate()
data = [(0.2, 53.3, 0.2, 53.3),
(1.1, 43.3, 0.3, 51.3),
(2.6, 22.4, 0.4, 43.3),
(3.7, 25.6, 0.2, 23.4)]
df = spark.createDataFrame(data, ['A','B','C','D'])
df.show(3)
df.printSchema()
vecAssembler = VectorAssembler(inputCols=['C','D'], outputCol="features")
new_df = vecAssembler.transform(df)
new_df.printSchema()
new_df.show(3)
split1_udf = udf(lambda value: value[0], DoubleType())
split2_udf = udf(lambda value: value[1], DoubleType())
new_df = new_df.withColumn('c1', split1_udf('features')).withColumn('c2', split2_udf('features'))
new_df.printSchema()
new_df.show(3)
【问题讨论】:
-
错误是什么?
-
错误信息长达一英里,我理解的关键行如下: 原因:net.razorvine.pickle.PickleException:ClassDict 构造的预期零参数(用于 numpy.dtype)
-
Py4JJavaErrorTraceback(最近一次调用最后)----> 1 new_df.show(3) /opt/cloudera/parcels/SPARK2/lib/spark2/python/pyspark/sql/dataframe.py in show(self, n, truncate, vertical) --> 350 print(self._jdf.showString(n, 20, vertical))
-
/usr/local/lib/python2.7/site-packages/py4j/java_gateway.pyc in __call__(self, *args) 1256 return_value = get_return_value( -> 1257 answer, self.gateway_client, self.target_id, self.name) /opt/cloudera/parcels/SPARK2/lib/spark2/python/pyspark/sql/utils.py in deco(*a, **kw) ---> 63 return f(*a , **kw) /usr/local/lib/python2.7/site-packages/py4j/protocol.pyc in get_return_value(answer, gateway_client, target_id, name) --> 328 格式(target_id, ".", name) , 值)
-
@Goodfaithuser 不要将错误消息粘贴到 cmets 中。相反edit 你的问题包括完整的追溯。我知道它会很长,但它就是这样。
标签: apache-spark pyspark