Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Kafka的StructuredStreaming中,我是否可以将值数据转换为实际的列名?_Scala_Apache Spark_Apache Kafka_Spark Structured Streaming - Fatal编程技术网

Scala 在Kafka的StructuredStreaming中,我是否可以将值数据转换为实际的列名?

Scala 在Kafka的StructuredStreaming中,我是否可以将值数据转换为实际的列名?,scala,apache-spark,apache-kafka,spark-structured-streaming,Scala,Apache Spark,Apache Kafka,Spark Structured Streaming,我有一个有列的csv文件,出于测试目的,我手动将其推送到Kafka,然后从那里将其读入Spark并应用一些解析,然后为测试目的执行控制台输出。现在,我了解到csv数据在结构化流媒体中以值的形式传输,我将其转换为字符串。我的要求是,我是否可以将值数据转换为实际列。csv文件中有数百列,但我只查看两个特定列“SERVICE_NAME8”和“u raw” 当我从路径中读取csv文件时,我使用spark.sql来提取这些列,但现在我使用结构化流式传输,我不确定是否可以将这些特定列提取为新的数据帧,然后应

我有一个有列的csv文件,出于测试目的,我手动将其推送到Kafka,然后从那里将其读入Spark并应用一些解析,然后为测试目的执行控制台输出。现在,我了解到csv数据在结构化流媒体中以值的形式传输,我将其转换为字符串。我的要求是,我是否可以将值数据转换为实际列。csv文件中有数百列,但我只查看两个特定列“SERVICE_NAME8”和“u raw”

当我从路径中读取csv文件时,我使用spark.sql来提取这些列,但现在我使用结构化流式传输,我不确定是否可以将这些特定列提取为新的数据帧,然后应用解析

val df = spark
      .readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", "10.160.172.45:9092, 10.160.172.46:9092, 10.160.172.100:9092")
      .option("subscribe", "TOPIC_WITH_COMP_P2_R2, TOPIC_WITH_COMP_P2_R2.DIT, TOPIC_WITHOUT_COMP_P2_R2.DIT")
      .load()

    val dfs = df.selectExpr("CAST(value AS STRING)").toDF()

    val data =dfs.withColumn("splitted", split($"value", "/"))
      .select($"splitted".getItem(4).alias("region"),$"splitted".getItem(5).alias("service"),col("value"))
      .withColumn("service_type", regexp_extract($"service", """.*(Inbound|Outbound|Outound).*""",1))
      .withColumn("region_type", concat(
        when(col("region").isNotNull,col("region")).otherwise(lit("null")), lit(" "),
        when(col("service").isNotNull,col("service_type")).otherwise(lit("null"))))

    val extractedDF = data.filter(
      col("region").isNotNull &&
        col("service").isNotNull &&
        col("value").isNotNull &&
        col("service_type").isNotNull &&
        col("region_type").isNotNull)
      .filter("region != ''")
      .filter("service != ''")
      .filter("value != ''")
      .filter("service_type != ''")
      .filter("region_type != ''")

val query = extractedDF
.writeStream
.format("console")
.outputMode("append")
.trigger(ProcessingTime("20 seconds"))
.start()
在val dfs=df.selectExpr(“CAST(value AS STRING)”).toDF()之后,我不知何故只需要提取两列“SERVICE_NAME8”和“u raw”,解析应该完成其余的工作并生成输出在快速示例中,您可以看到
df.as[String].map(u.split(“/”)
应将流转换为与spark.sql代码中相同的
数据。
接下来,您可以只提取所需的列并对其进行处理。例如
data.map(行=>(行[SERVICE\u NAME\u COLUMN\u INDEX],行[RAW\u COLUMN\u INDEX]))

将为每行获取两列的
元组。

请注意,这只是一个例子。我不运行它。另外,我认为
Tuple
并不是最好的解决方案。

我只是想了解我投票反对的原因,我投票反对你,可能是因为没有阅读手册。