Spark Redis连接器:将数据写入Redis特定索引

4
我试图从Cassandra读取数据并将其写入Redis的特定索引,例如Redis DB 5。
我需要以哈希映射格式将所有数据写入到Redis DB索引5中。
 val spark = SparkSession.builder()
  .appName("redis-df")
  .master("local[*]")
  .config("spark.redis.host", "localhost")
  .config("spark.redis.port", "6379")
  .config("spark.redis.db", 5)
  .config("spark.cassandra.connection.host", "localhost")
  .getOrCreate()

  import spark.implicits._
    val someDF = Seq(
      (8, "bat"),
      (64, "mouse"),
      (-27, "horse")
    ).toDF("number", "word")

    someDF.write
      .format("org.apache.spark.sql.redis")
      .option("keys.pattern", "*")
      //.option("table", "person"). // Is it mandatory ?
      .save()

我可以在Redis中保存数据而不需要表名吗?实际上,我只想将所有数据保存到Redis的第5个索引中,而无需表名,这可行吗? 我已经查阅了spark Redis连接器的文档,但是没有找到相关示例。 文档链接:https://github.com/RedisLabs/spark-redis/blob/master/doc/dataframe.md#writing 我目前正在使用spark redis-connector的此版本。
    <dependency>
        <groupId>com.redislabs</groupId>
        <artifactId>spark-redis_2.11</artifactId>
        <version>2.5.0</version>
    </dependency>

有人遇到这个问题吗?有什么解决办法吗?

如果在配置中没有提及表名,我会得到以下错误:

失败

  java.lang.IllegalArgumentException: Option 'table' is not set.
  at org.apache.spark.sql.redis.RedisSourceRelation$$anonfun$tableName$1.apply(RedisSourceRelation.scala:208)
  at org.apache.spark.sql.redis.RedisSourceRelation$$anonfun$tableName$1.apply(RedisSourceRelation.scala:208)
  at scala.Option.getOrElse(Option.scala:121)
  at org.apache.spark.sql.redis.RedisSourceRelation.tableName(RedisSourceRelation.scala:208)
  at org.apache.spark.sql.redis.RedisSourceRelation.saveSchema(RedisSourceRelation.scala:245)
  at org.apache.spark.sql.redis.RedisSourceRelation.insert(RedisSourceRelation.scala:121)
  at org.apache.spark.sql.redis.DefaultSource.createRelation(DefaultSource.scala:30)
  at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:45)
  at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:70)
  at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:68)
2个回答

2

表选项是必须的。这意味着您需要指定表名称,以便可以从Redis中读取数据框提供该表名。

在您的情况下,另一个选项是将数据框转换为键/值 RDD 并使用 sc.toRedisKV(rdd)


0

我不太同意。我正在处理与您完全相同的问题。这是我发现的:

  1. 您必须引用表格或键模式。 (例如)

    df = spark.read.format(“org.apache.spark.sql.redis”)
    .option(“keys.pattern”,“rec-*”)
    .option(“infer.schema”,True).load()

在我的情况下,我正在使用HASH,而所有HASH键都以“rec-”开头,后跟一个整数。 spark-redis代码将“rec-”视为表格。如上所述,诀窍在于如果您想将数据读回Spark,则需要表名。它想要一个表名,但似乎使用冒号作为分隔符。由于我想进行读/写操作,因此我只需将表格名称更改为“rec:”,然后就可以了。

我认为您的困惑源于以下事实,在您的示例中,您只定义了一个Spark记录。如果您有两个呢?Redis需要创建两个不同的键,如“person:1”或“person:2”。它使用术语表来描述“person”。它是键还是表格?文档似乎不一致。

我目前遇到的问题是如何通过更改数据库上下文.config("spark.redis.db", 5)来保存到不同的Redis数据库。但是,当我在df.write.format中使用它时,它似乎对我无效。你有什么想法吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接