我通过Java中的命令收到一个JSON输入,它在Spark Streaming上有几行和属性:
JavaReceiverInputDStream <String>
lines = ssc.socketTextStream
(localhost, port)
我现在想要过滤行流,这样它在每一行中只有两个特定属性,并转储其余行。
这里的问题是我发现线条没有保留JSON结构,也就是说,我不能只做
JavaDstream<String> line=lines[1];
line.print() ;
我的问题是,如何让我的JavaDStream保持JSON对象的结构,然后打印出我想要的行?
我希望我很清楚,谢谢你。
答案 0 :(得分:2)
曼努埃尔,
所以基本上你的问题是如何确保整个JSON有效负载是RDD中的单个记录,或者当你在套接字上发送消息时记录边界是什么。
所以基本上你使用的socketTextStream读取socket上的消息,如果它找到一个新的行字符,它将使用它作为记录边界。用于侦听套接字,读取消息并将其传递给Spark的实际代码是SocketReceiver.bytesToLines()方法的一部分,如果你查看注释,这就是它所说的
/**
* This methods translates the data from an inputstream (say, from a socket)
* to '\n' delimited strings and returns an iterator to access the strings.
*/
因此,请务必从JSON消息中取出\ n字符,将您的发送火花作为单个记录
苏尼