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

时间:2019-05-20 01:13:57

标签: python apache-spark apache-spark-sql spark-structured-streaming

我正在测试使用本地主机(从本地主机读取数据流)的结构化流。从本地主机输入流数据:

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  

1 个答案:

答案 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")) ,依此类推