У меня возникла проблема при преобразовании шестнадцатеричного числа в десятичное (узнано здесь) в pyspark.
from pyspark.sql.functions import col, sha2, conv, substring
# User data with ZIPs
user_data = [
("100052441000101", "21001"),
("100052441000102", "21002"),
("100052441000103", "21002"),
("user1", "21001"),
("user2", "21002")
]
df_users = spark.createDataFrame(user_data, ["user_id", "ZIP"])
# Generate SHA-256 hash from the user_id
df_users = df_users.withColumn("hash_key", sha2(col("user_id"), 256))
# Convert the hexadecimal hash (sha2 output) to decimal
df_users = df_users.withColumn("hash_substr1", substring(col('hash_key'), 1, 16))
df_users = df_users.withColumn("hash_substr2", substring(col('hash_key'), 1, 15))
df_users = df_users.withColumn("hash_int1", conv(col('hash_substr1'), 16, 10).cast("bigint"))
df_users = df_users.withColumn("hash_int2", conv(col('hash_substr2'), 16, 10).cast("bigint"))
df_users.show()
Я получаю следующий результат:
+---------------+-----+--------------------+----------------+---------------+-------------------+-------------------+
| user_id| ZIP| hash_key| hash_substr1| hash_substr2| hash_int1| hash_int2|
+---------------+-----+--------------------+----------------+---------------+-------------------+-------------------+
|100052441000101|21001|3cf4b90397964f6b2...|3cf4b90397964f6b|3cf4b90397964f6|4392338961672327019| 274521185104520438|
|100052441000102|21002|e18aec7bb2a60b62d...|e18aec7bb2a60b62|e18aec7bb2a60b6| null|1015753888833888438|
|100052441000103|21002|e55127f9f61bbe433...|e55127f9f61bbe43|e55127f9f61bbe4| null|1032752028895525860|
| user1|21001|0a041b9462caa4a31...|0a041b9462caa4a3|0a041b9462caa4a| 721732164412679331| 45108260275792458|
| user2|21002|6025d18fe48abd451...|6025d18fe48abd45|6025d18fe48abd4|6928174017724202309| 433010876107762644|
+---------------+-----+--------------------+----------------+---------------+-------------------+-------------------+
Обратите внимание, что hash_int1 имеет значение null для 2-й и 3-й записей.
Однако, когда я пытаюсь получить соответствующий int с помощью Python, я получаю некоторые значение:
hexes = ["e18aec7bb2a60b62", "e18aec7bb2a60b6", "e55127f9f61bbe43", "e55127f9f61bbe4"]
[int(h, 16) for h in hexes]
[16252062221342215010, 1015753888833888438, 16524032462328413763, 1032752028895525860]
Значения одинаковы, если они не равны нулю.
Конечная цель — генерировать воспроизводимые случайные значения
df_users = df_users.withColumn("random_value", (col("hash_int1") % 10**12) / 10**12)
Подробнее здесь: https://stackoverflow.com/questions/793 ... to-decimal
Pyspark — проблема при преобразовании шестнадцатеричного числа в десятичное ⇐ Python
Программы на Python
1736450362
Anonymous
У меня возникла проблема при преобразовании шестнадцатеричного числа в десятичное (узнано здесь) в pyspark.
from pyspark.sql.functions import col, sha2, conv, substring
# User data with ZIPs
user_data = [
("100052441000101", "21001"),
("100052441000102", "21002"),
("100052441000103", "21002"),
("user1", "21001"),
("user2", "21002")
]
df_users = spark.createDataFrame(user_data, ["user_id", "ZIP"])
# Generate SHA-256 hash from the user_id
df_users = df_users.withColumn("hash_key", sha2(col("user_id"), 256))
# Convert the hexadecimal hash (sha2 output) to decimal
df_users = df_users.withColumn("hash_substr1", substring(col('hash_key'), 1, 16))
df_users = df_users.withColumn("hash_substr2", substring(col('hash_key'), 1, 15))
df_users = df_users.withColumn("hash_int1", conv(col('hash_substr1'), 16, 10).cast("bigint"))
df_users = df_users.withColumn("hash_int2", conv(col('hash_substr2'), 16, 10).cast("bigint"))
df_users.show()
Я получаю следующий результат:
+---------------+-----+--------------------+----------------+---------------+-------------------+-------------------+
| user_id| ZIP| hash_key| hash_substr1| hash_substr2| hash_int1| hash_int2|
+---------------+-----+--------------------+----------------+---------------+-------------------+-------------------+
|100052441000101|21001|3cf4b90397964f6b2...|3cf4b90397964f6b|3cf4b90397964f6|4392338961672327019| 274521185104520438|
|100052441000102|21002|e18aec7bb2a60b62d...|e18aec7bb2a60b62|e18aec7bb2a60b6| null|1015753888833888438|
|100052441000103|21002|e55127f9f61bbe433...|e55127f9f61bbe43|e55127f9f61bbe4| null|1032752028895525860|
| user1|21001|0a041b9462caa4a31...|0a041b9462caa4a3|0a041b9462caa4a| 721732164412679331| 45108260275792458|
| user2|21002|6025d18fe48abd451...|6025d18fe48abd45|6025d18fe48abd4|6928174017724202309| 433010876107762644|
+---------------+-----+--------------------+----------------+---------------+-------------------+-------------------+
Обратите внимание, что hash_int1 имеет значение null для 2-й и 3-й записей.
Однако, когда я пытаюсь получить соответствующий int с помощью Python, я получаю некоторые значение:
hexes = ["e18aec7bb2a60b62", "e18aec7bb2a60b6", "e55127f9f61bbe43", "e55127f9f61bbe4"]
[int(h, 16) for h in hexes]
[16252062221342215010, 1015753888833888438, 16524032462328413763, 1032752028895525860]
Значения одинаковы, если они не равны нулю.
Конечная цель — генерировать воспроизводимые случайные значения
df_users = df_users.withColumn("random_value", (col("hash_int1") % 10**12) / 10**12)
Подробнее здесь: [url]https://stackoverflow.com/questions/79343784/pyspark-issue-in-converting-hex-to-decimal[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия