Подробнее:
- У меня есть DataFrame с миллионами строк.
- Запись в Redis работает правильно для небольших DataFrame, но когда DataFrame большой, некоторые после записи строки кажутся пропущенными.
- Обратное чтение из Redis через соединитель Spark-Redis возвращает меньше строк, чем исходный DataFrame.
- Чтение напрямую по ключу или с помощью scan_iter также возвращает меньше строк. записи.
- В DataFrame нет повторяющихся строк.
- Эта проблема возникает только с большими наборами данных; небольшие наборы данных записываются правильно.
- Почему Spark-Redis удаляет строки при записи больших DataFrames?
- Существуют ли какие-либо рекомендуемые настройки, конфигурации или подходы для надежной записи больших наборов данных в Redis с помощью Spark-Redis?
# Prepare Redis key column
df_to_redis = df.withColumn("key", F.concat(F.lit("{"), F.col("uid"), F.lit("}"))).select("key", "lang")
# Write to Redis
df_to_redis.write.format("org.apache.spark.sql.redis") \
.option("table", "info") \
.option("key.column", "key")
.option("host", "REDIS_HOST") \
.option("port", 6379) \
.option("dbNum", 0) \
.mode("append") \
.save()
# Reading back from Redis using Spark-Redis
df_redis = spark.read.format("org.apache.spark.sql.redis") \
.option("table", "info") \
.option("host", "REDIS_HOST") \
.option("port", 6379) \
.option("dbNum", 0) \
.load()
# Reading all keys directly from Redis using redis-py keys()
r = redis.Redis(host="REDIS_HOST", port=6379, db=0)
all_keys = r.keys("info:*")
print(f"Number of keys read via keys(): {len(all_keys)}")
# Reading all keys from Redis using scan_iter()
r = redis.Redis(host="REDIS_HOST", port=6379, db=0)
keys = list(r.scan_iter("info:*"))
print(f"Number of keys read via scan_iter: {len(keys)}")
Мобильная версия