Python 如何在pyspark中将处理过的kafka数据流保存在文本文件中?

Python 如何在pyspark中将处理过的kafka数据流保存在文本文件中?,python,apache-spark,pyspark,apache-kafka,Python,Apache Spark,Pyspark,Apache Kafka,我从spark中的卡夫卡主题中读取数据,创建一个数据流,然后使用两个用户定义的函数对其进行处理,并将结果保存到文本文件中。我尝试了saveRec函数,该函数已经实现,但不起作用。它将奇怪的字符打印到文本文件中 但是,当我使用pprint()将结果打印到控制台时,它工作正常 使用pprint()输出到控制台: [80及81] [233234] [273273] [469469] [621621] [667668] [809809] [926 927] [935936] [1001001] from

我从spark中的卡夫卡主题中读取数据,创建一个数据流,然后使用两个用户定义的函数对其进行处理,并将结果保存到文本文件中。我尝试了saveRec函数,该函数已经实现,但不起作用。它将奇怪的字符打印到文本文件中

但是,当我使用pprint()将结果打印到控制台时,它工作正常

使用pprint()输出到控制台:

[80及81]

[233234]

[273273]

[469469]

[621621]

[667668]

[809809]

[926 927]

[935936]

[1001001]

from pyspark.sql import SparkSession
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils

if __name__ == "__main__":
    print("hello spark")

    sc = SparkContext(appName="STALTA")
    ssc = StreamingContext(sc, 1)
    broker, topic = sys.argv[1:]
    # Connect to Kafka

    kvs = KafkaUtils.createStream(ssc, broker, "raw-event-streaming-consumer",{topic:1})

    lines = kvs.map(lambda x: x[1])
    ds = lines.flatMap(lambda line: line.strip().split("\n")).map(lambda strelem: float(strelem))

    mapped = ds.mapPartitions(lambda i: classic_sta_lta_py(np.array(list(i))))


    mapped1 = mapped.mapPartitions(lambda j: trigger_onset(np.array(list(j))))
    def saveRec(rdd):
        rdd.foreach(lambda rec: open("/Users/zeinab/kafka_2.11-1.1.0/outputFile.txt", "a").write(rec))

    mapped1.pprint()

    mapped1.foreachRDD(saveRec)


    ssc.start()
    ssc.awaitTermination()

有人知道问题出在哪里吗?

您正在写二进制数据。你需要把它解码成一个String@cricket_007我该怎么做?我试过这些,但没有一个有效。def saveRec(rdd):rdd.foreach(lambda rec:open(“/Users/zeinab/kafka_2.11-1.1.0/outputFile.txt”,“a”)。write(np.char.decode(rec))或def saveRec(rdd):rdd.foreach(lambda rec:open(“/Users/zeinab/kafka_2.11-1.0/outputFile.txt”,“a”)。write(rec.astype('U13'))类似于
map(da x:x.decode('lambutf-8'))
,我想。我通常使用标准的卡夫卡API,而不是Spark@cricket_007谢谢。我试过了,但我得到了以下错误:
AttributeError:'numpy.ndarray'对象没有属性“map”
函数:
def saveRec(rdd):rdd.foreach(lambda rec:open(“/Users/zeinab/kafka_2.11-1.1.0/outputFile.txt”,“a”).write(rec.map(lambda x:x.decode('utf-8'))
No,在所有这些之前…
line=kvs.map(lambda x:x[1]。decode('utf-8'))