Apache spark 如何在结构化流中将数据帧转换为RDD?

Apache spark 如何在结构化流中将数据帧转换为RDD?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我使用pyspark流从kafka获取数据,结果是一个数据帧,当我将数据帧转换为rdd时,它出错了: Traceback (most recent call last): File "/home/docs/dp_model/dp_algo_platform/dp_algo_core/test/test.py", line 36, in <module> df = df.rdd.map(lambda x: x.value.split(" ")).toDF() File "/home/s

我使用pyspark流从kafka获取数据,结果是一个数据帧,当我将数据帧转换为rdd时,它出错了:

Traceback (most recent call last):
File "/home/docs/dp_model/dp_algo_platform/dp_algo_core/test/test.py", line 36, in <module>
df = df.rdd.map(lambda x: x.value.split(" ")).toDF()
File "/home/softs/spark-2.4.3-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/sql/dataframe.py", line 91, in rdd
File "/home/softs/spark-2.4.3-bin-hadoop2.6/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
File "/home/softs/spark-2.4.3-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/sql/utils.py", line 69, in deco
pyspark.sql.utils.AnalysisException: 'Queries with streaming sources must be executed with writeStream.start();;\nkafka'
这是错误的版本代码:

spark = SparkSession \
    .builder \
    .appName("StructuredNetworkWordCount") \
    .getOrCreate()

df = spark \
    .readStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", "localhost:9092") \
    .option("subscribe", "test") \
    .load()

df = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
df = df.withColumn("s", F.split(df['value'], " "))
df = df.withColumn('e', F.explode(df['s']))
# df = df.rdd.map(lambda x: x.value.split(" ")).toDF()

q = df.writeStream \
    .format("console") \
    .trigger(processingTime='30 seconds') \
    .start()

q.awaitTermination()
spark = SparkSession \
    .builder \
    .appName("StructuredNetworkWordCount") \
    .getOrCreate()

df = spark \
    .readStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", "localhost:9092") \
    .option("subscribe", "test") \
    .load()

df = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
# df = df.withColumn("s", F.split(df['value'], " "))
# df = df.withColumn('e', F.explode(df['s']))
df = df.rdd.map(lambda x: x.value.split(" ")).toDF()

q = df.writeStream \
    .format("console") \
    .trigger(processingTime='30 seconds') \
    .start()

q.awaitTermination()

为什么它不能将数据帧转换为rdd?当我想在pyspark流媒体中将数据帧转换为rdd时,我该怎么办?

这个rdd特性根本不受支持。RDD是传统的,Spark结构化流媒体是基于DF/DS的。通用抽象,无论是流式还是批处理

结构化流正在spark sql enginer上运行。不支持将数据帧或数据集转换为RDD。

要对数据帧字段执行特定操作,可以使用UDF函数,甚至可以创建spark自定义转换器。但也有一些数据帧操作不受支持,如转换为RDD。

如果您的spark版本为2.4.0及以上,那么您可以使用下面的替代方案来处理数据帧的每一行

query=df.writeStream.foreach(Customized method to work on each row of dataframe rather than RDD).outputMode("update").start()
    ssc.start()
    ssc.awaitTermination()

如果不支持,我如何使用pyspark流媒体将Kafka数据读取为RDD,我的spark版本是2.4.3,Kafka版本是2.1.0?结构化流媒体不同。@littlely spark流媒体!=结构化流化是否可以将spark数据帧转换为流式数据帧?@Innovator programmer否否请对您的答案添加一些解释,以便其他人可以从itEg中学习:下面的foreach类将解析结构化流式数据帧中的每一行,并将其传递给SendToKudu\ForeachWriter类,它将具有将其转换为rdd的逻辑。传递的行将采用数据帧的形式,因此可以使用df.rdd将其转换为rdd。类SendToKudu_ForeachWriter():def process(self,row):#处理作为数据帧传递到此处的行的逻辑“if name='main”:query=stream\u parsed_dataframe.writeStream.foreach(SendToKudu_ForeachWriter()).outputMode(“update”).start()query.waittermination()请通过编辑将所有澄清添加到您的答案中