проблема pyspark с круглой функцией - PullRequest
0 голосов
/ 24 февраля 2020

Я использую zeppelin pyspark и пытаюсь округлить значение столбца RDD (преобразованного из Dataframe), но получаю ошибку.

    %pyspark
    import pyspark.sql.functions as F
    orderfinal = orderjoin.rdd.map(lambda x: ((x[1], x[2]), (x[4], x[5]))). \
        combineByKey(lambda value: (value[0], value[1]),
                        lambda x, value: (x[0] + value[0], x[1] + value[1]),
                        lambda x, y: (x[0] + y[0], x[1] + y[1])). \
        map(lambda x: (x[0][0], x[0][1].strftime("%Y-%B-%d"), x[1][0], float(x[1][1])))
    for i in (orderfinal.take(5)): print i
(u'Shipped', '2003-November-06', 977, 99916.59000000001)
(u'Shipped', '2004-February-18', 167, 16901.38)
(u'Shipped', '2003-April-11', 27, 1627.56)
(u'Shipped', '2004-April-02', 390, 29284.420000000002)
(u'Shipped', '2004-October-06', 70, 3474.66)

Теперь я попытался округлить последний столбец из RDD

    %pyspark
    orderfinal.map(lambda x: (x[0], x[1], x[2], round(x[3], 2))).take(5)
  File "/usr/hdp/current/spark2-client/python/pyspark/sql/functions.py", line 567, in round
    return Column(sc._jvm.functions.round(_to_java_column(col), scale))
AttributeError: 'NoneType' object has no attribute '_jvm'

Затем я попытался запустить простую функцию python round, но все еще получаю ошибку.

    %pyspark
    print(round(3424.34242342,2))
Fail to execute line 1: print(round(3424.34242342,2))
Traceback (most recent call last):
  File "/tmp/zeppelin_pyspark-6587764996600827880.py", line 380, in <module>
    exec(code, _zcUserQueryNameSpace)
  File "<stdin>", line 1, in <module>
  File "/usr/hdp/current/spark2-client/python/lib/pyspark.zip/pyspark/sql/functions.py", line 567, in round
    return Column(sc._jvm.functions.round(_to_java_column(col), scale))
  File "/usr/hdp/current/spark2-client/python/lib/pyspark.zip/pyspark/sql/column.py", line 54, in _to_java_column
    "function.".format(col, type(col)))
TypeError: Invalid argument, not a string or column: 3424.34242342 of type <type 'float'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.

Я попытался выполнить раунд в кадре данных и его работает нормально но не в RDD. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 24 февраля 2020

Если вы посмотрите документацию для pyspark. sql .functions.round () , он принимает ввод col объекта. Следовательно, он не будет работать для значения float, такого как 3424.342434.

Однако с RDD или сингулярными переменными вы должны использовать встроенную функцию round() или np.round().

%pyspark
print(round(3424.34242342,2))

^ Я думаю, что встроенная функция round здесь переопределяется функцией pyspark.

...