PySpark结构化流数据写入Cassandra中而不填充数据

时间:2019-10-09 11:14:26

标签: apache-spark cassandra pyspark spark-structured-streaming spark-cassandra-connector

我想将Spark结构化的流数据写入cassandra。我的Spark版本是2.4.0。

我来自Kafka的输入源是JSON,因此在写入控制台时可以,但是当我在cqlsh Cassandra中查询时,没有记录追加到表中。你能告诉我怎么了吗?

schema = StructType() \
            .add("humidity", IntegerType(), True) \
            .add("time", TimestampType(), True) \
            .add("temperature", IntegerType(), True) \
            .add("ph", IntegerType(), True) \
            .add("sensor", StringType(), True) \
            .add("id", StringType(), True)

def writeToCassandra(writeDF, epochId):
    writeDF.write \
        .format("org.apache.spark.sql.cassandra") \
        .mode('append') \
        .options("spark.cassandra.connection.host", "cassnode1, cassnode2") \
        .options(table="sensor", keyspace="sensordb") \
        .save()

# Load json format to dataframe
df = spark \
      .readStream \
      .format("kafka") \
      .option("kafka.bootstrap.servers", "kafkanode") \
      .option("subscribe", "iot-data-sensor") \
      .load() \
      .select([
            get_json_object(col("value").cast("string"), "$.{}".format(c)).alias(c)
            for c in ["humidity", "time", "temperature", "ph", "sensor", "id"]])

df.writeStream \
    .foreachBatch(writeToCassandra) \
    .outputMode("update") \
    .start()

1 个答案:

答案 0 :(得分:0)

我在pyspark中遇到了同样的问题。请尝试以下步骤

  1. 首先,验证它是否已连接到cassandra。您可以指向一个不可用的表,然后查看它是否由于“未找到表”而失败

  2. 尝试如下所示的writeStream(在调用cassandra更新之前包括触发和输出模式)

df.writeStream \ .trigger(processingTime="10 seconds") \ .outputMode("update") \ .foreachBatch(writeToCassandra) \