Я работаю со свечами 2.2.0 и pyspark2.
Я создал DataFrame df
и теперь пытаюсь добавить новый столбец "rowhash"
, который является хэшем sha2 определенных столбцов в DataFrame.
Например, скажем, что df
имеет столбцы: (column1, column2, ..., column10)
Мне требуется sha2((column2||column3||column4||...... column8), 256)
в новом столбце "rowhash"
.
Пока я пытался использовать следующие методы:
1) Используется hash()
функция, но, поскольку она дает целочисленный вывод, она не очень полезна
2) Попытка с использованием функции sha2()
, но она не работает.
Скажите, columnarray
имеет массив столбцов, которые мне нужны.
def concat(columnarray):
concat_str = ''
for val in columnarray:
concat_str = concat_str + '||' + str(val)
concat_str = concat_str[2:]
return concat_str
, а затем
df1 = df1.withColumn("row_sha2", sha2(concat(columnarray),256))
Это ошибка с ошибкой «не удается разрешить».
Спасибо, gaw за ваш ответ. Поскольку мне нужно хэшировать только определенные столбцы, я создал список имен этих столбцов (в hash_col) и изменил вашу функцию следующим образом:
def sha_concat(row, columnarray):
row_dict = row.asDict() #transform row to a dict
concat_str = ''
for v in columnarray:
concat_str = concat_str + '||' + str(row_dict.get(v))
concat_str = concat_str[2:]
#preserve concatenated value for testing (this can be removed later)
row_dict["sha_values"] = concat_str
row_dict["sha_hash"] = hashlib.sha256(concat_str).hexdigest()
return Row(**row_dict)
Затем передается как:
df1.rdd.map(lambda row: sha_concat(row,hash_col)).toDF().show(truncate=False)
Однако теперь происходит сбой с ошибкой:
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 8: ordinal not in range(128)
Я вижу значение \ ufffd в одном из столбцов, поэтому я не уверен, есть ли способ справиться с этим?