我正在测试使用本地主机(从本地主机读取数据流)的结构化流。从本地主机输入流数据:
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 Average Marks
1 82.5
2 75
答案 0 :(得分:0)
您的数据框没有名为ID的列,但您正在尝试对其分组。您需要像这样拆分名为“值”的列:
(np.diff(s)!=0).sum()
Out[497]: 3
然后在df上分组:
df = marks\
.withColumn("value", split(col("value"),"\\,")) \
.select(
col("value").getItem(0).cast("int").alias("ID"),
col("value").getItem(1).alias("Subject"),
col("value").getItem(2).cast("int").alias("Marks")) \
.drop("value")
假设:输入的格式为result = df.groupBy("ID").agg(avg("Marks").as("Average Marks"))
,依此类推