如何使用python在spark结构化流媒体中转换数据帧?

如何使用python在spark结构化流媒体中转换数据帧?,python,apache-spark,apache-spark-sql,spark-structured-streaming,Python,Apache Spark,Apache Spark Sql,Spark Structured Streaming,我正在使用localhost测试结构化流,它从中读取数据流。从本地主机输入流数据: ID Subject Marks -------------------- 1 Maths 85 1 Physics 80 2 Maths 70 2 Physics 80 我想得到每个唯一ID的平均分数 我尝试了这一点,但无法转换DF,它是一个单一的值 下面是我的代码: from pyspark.sql import SparkSession fro

我正在使用localhost测试结构化流,它从中读取数据流。从本地主机输入流数据:

ID   Subject  Marks
--------------------
1    Maths    85  
1    Physics  80  
2    Maths    70  
2    Physics  80  
我想得到每个唯一ID的平均分数

我尝试了这一点,但无法转换DF,它是一个单一的值

下面是我的代码:

from pyspark.sql import SparkSession
from pyspark.sql.functions import *  
from pyspark.sql.types import *
spark = SparkSession.builder.appName("SrteamingAge").getOrCreate()

schema = StructType([StructField("ID", IntegerType(), \  
True),StructField("Subject", StringType(), True),StructField("Marks", \
IntegerType(), True)])

marks = spark.readStream.format("socket").option("host", 
"localhost").option("port", 9999).schema(schema).load()
marks.printSchema()
result = marks.groupBy("ID").agg(avg("Marks").alias("Average Marks"))
但我得到了以下错误:

    root
      |-- value: string (nullable = true)

Pyspark.sql.utils.Analysisexception: "u can not resolve 'ID' given input columns: [value];"
我正在创建一个相同的模式,但没有运气。任何帮助都将不胜感激

我的预期输出只有2列(ID和平均分数)


您的数据帧没有名为ID的列,但您正在尝试对其进行分组。您需要拆分名为“value”的列,如下所示:

df=标记\
.带列(“值”,拆分(列(“值”),“\\,”)\
.选择(
col(“value”).getItem(0).cast(“int”).alias(“ID”),
col(“value”).getItem(1).别名(“主题”),
col(“value”).getItem(2).cast(“int”).alias(“Marks”))\
.下降(“价值”)
然后在df上分组:

result=df.groupBy(“ID”).agg(平均(“分数”).as(“平均分数”))

假设:输入形式为
1、数学、85等

平均分数优于平均分数。你能再给我看一些代码吗?有各种各样的输出模式需要考虑。下面是你想做的事情:<代码>标记。GROMPBY(“ID”)。AGG(AVG(“标记”))(“平均标记”)但这不起作用,因为查看模式,列类型是字符串。看一下这里的代码示例,了解如何将字符串流转换为具有所需模式的dataframe:我已经更新了上面的代码,但没有成功@Harichandanpulagam问题是您的数据帧没有名为ID的列,但您正在尝试对其进行分组。您需要拆分名为“value”的列,如下所示:
df=marks.withColumn(“value”),split(col(“value”),“\\”))。选择(col(“value”)。getItem(0)。cast(“int”)。别名(“ID”),col(“value”)。getItem(1)。别名(“Subject”),col(“value”)。getItem(2)。cast(“int”)。别名(“marks”)。drop(“value”)
,然后分组到
df
,假设您输入它
1、数学、85等
ID  Average Marks  
1     82.5  
2     75