Почему моя функция pyspark udf возвращает None для меня?

avatar
nick_liu
8 апреля 2018 в 04:08
853
0
0

Мои данные после соединения имеют значение None, поэтому я хочу заполнить их вектором. Например, мои данные имеют вид

.
id  value
1   [1,2,3,4,5]
2   Null
3   [1,2,3,4,5]
4   [1,2,3,4,5]
5   [1,2,3,4,5]

и моя функция udf

def fillVec_5(y):
    if y:
        return y 
    else:
        return Vectors.dense([0 for i in range(5)])
getVector_5 = udf(lambda y: fillVec_5(y),VectorUDT())
df = df.withColumn('value',getVector_5(col('value'))
df.show(5,False)

Но я получаю сообщение об ошибке:

  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/worker.py", line 111, in main
    process()
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/worker.py", line 106, in process
    serializer.dump_stream(func(split_index, iterator), outfile)
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 263, in dump_stream
    vs = list(itertools.islice(iterator, batch))
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 139, in load_stream
    yield self._read_with_length(stream)
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 164, in _read_with_length
    return self.loads(obj)
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 442, in loads
    return pickle.loads(obj)
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py", line 1159, in <lambda>
    return lambda *a: dataType.fromInternal(a)
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py", line 565, in fromInternal
    values = [f.fromInternal(v) for f, v in zip(self.fields, obj)]
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py", line 438, in fromInternal
    return self.dataType.fromInternal(obj)
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py", line 619, in fromInternal
    return self.deserialize(self._cachedSqlType().fromInternal(obj))
  File "/opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/mllib/linalg/__init__.py", line 166, in deserialize
    assert len(datum) == 4, \
TypeError: ("object of type 'NoneType' has no len()", <function <lambda> at 0x1dba938>  (None,))

Я не понимаю, почему моя функция udf возвращает None для меня, пожалуйста, помогите мне~

Источник
Alper t. Turker
8 апреля 2018 в 11:06
0

Невозможно воспроизвести проблему с помощью предоставленного вами кода.

nick_liu
8 апреля 2018 в 12:22
0

Может быть, это причина искровой версии? Я использую версию 1.6.0

karthikr
8 апреля 2018 в 20:43
0

Это означает, что значение y равно None. Возможно, вы захотите проверить len, если это не None

Ответы (0)