Apache spark 发生异常:pyspark.sql.utils.AnalysisException';必须使用writeStream.start();;执行具有流源的查询\恩卡夫卡';

Apache spark 发生异常:pyspark.sql.utils.AnalysisException';必须使用writeStream.start();;执行具有流源的查询\恩卡夫卡';,apache-spark,pyspark,spark-structured-streaming,Apache Spark,Pyspark,Spark Structured Streaming,在密码处 如果不是df.head(1),则为空: 我有个例外 我不知道如何在流数据中使用if。 当我使用jupyter执行每一行时,代码都很好,我可以得到我的结果。但是使用。py它不好 我的假设是:我希望使用流媒体每隔一秒钟从卡夫卡获取数据,然后我将每一批流媒体数据(一批表示我每秒获取的数据)转换为pandas数据帧,然后我使用pandas函数对数据进行处理,最后我将结果发送到其他卡夫卡主题 请帮助我,原谅我的台球英语,谢谢 sc = SparkContext("local[2]", "Odom

在密码处 如果不是df.head(1),则为空: 我有个例外

我不知道如何在流数据中使用if。 当我使用jupyter执行每一行时,代码都很好,我可以得到我的结果。但是使用。py它不好

我的假设是:我希望使用流媒体每隔一秒钟从卡夫卡获取数据,然后我将每一批流媒体数据(一批表示我每秒获取的数据)转换为pandas数据帧,然后我使用pandas函数对数据进行处理,最后我将结果发送到其他卡夫卡主题

请帮助我,原谅我的台球英语,谢谢

sc = SparkContext("local[2]", "OdometryConsumer")
spark = SparkSession(sparkContext=sc) \
    .builder \
    .appName("StructuredNetworkWordCount") \
    .getOrCreate()

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.enabled", "true")


df = spark \
  .readStream \
  .format("kafka") \
  .option("kafka.bootstrap.servers", "localhost:9092") \
  .option("subscribe", "data") \
  .load()
ds = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
print(type(ds))

if not df.head(1).isEmpty:
  alertQuery = ds \
          .writeStream \
          .queryName("qalerts")\
          .format("memory")\
          .start()

  alerts = spark.sql("select * from qalerts")
  pdAlerts = alerts.toPandas()
  a = pdAlerts['value'].tolist()

  d = []
  for i in a:
      x = json.loads(i)
      d.append(x)

  df = pd.DataFrame(d)
  print(df)
  ds = df['jobID'].unique().tolist()


  dics = {}
  for source in ds:
      ids = df.loc[df['jobID'] == source, 'id'].tolist()
      dics[source]=ids

  print(dics)  
query = ds \
  .writeStream \
  .queryName("tableName") \
  .format("console") \
  .start()

query.awaitTermination()

如果不是df.head(1),请删除
。i空:
,您应该没事

出现异常的原因很简单,即流式查询是一种结构化查询,它永远不会结束并持续执行。仅仅看一个元素是不可能的,因为没有“单一元素”,但(可能)有数千个元素,很难确定何时你想在封面下看到一个元素

sc = SparkContext("local[2]", "OdometryConsumer")
spark = SparkSession(sparkContext=sc) \
    .builder \
    .appName("StructuredNetworkWordCount") \
    .getOrCreate()

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.enabled", "true")


df = spark \
  .readStream \
  .format("kafka") \
  .option("kafka.bootstrap.servers", "localhost:9092") \
  .option("subscribe", "data") \
  .load()
ds = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
print(type(ds))

if not df.head(1).isEmpty:
  alertQuery = ds \
          .writeStream \
          .queryName("qalerts")\
          .format("memory")\
          .start()

  alerts = spark.sql("select * from qalerts")
  pdAlerts = alerts.toPandas()
  a = pdAlerts['value'].tolist()

  d = []
  for i in a:
      x = json.loads(i)
      d.append(x)

  df = pd.DataFrame(d)
  print(df)
  ds = df['jobID'].unique().tolist()


  dics = {}
  for source in ds:
      ids = df.loc[df['jobID'] == source, 'id'].tolist()
      dics[source]=ids

  print(dics)  
query = ds \
  .writeStream \
  .queryName("tableName") \
  .format("console") \
  .start()

query.awaitTermination()