Scala和apache flink的新手,为什么我的map函数正确运行REPL但在Flink中失败

时间:2016-11-22 15:41:30

标签: scala kafka-consumer-api apache-flink flink-streaming

我正在尝试(失败)在Apache Flink中运行一个简单的hello world类型程序。代码接收来自Apache Kafka的消息添加了一个"。"在每个字母后面并将新字符串打印到stdout。代码正确地从Kafka获取消息,但map函数添加"。"失败。我在REPL提示符下尝试了该函数,scala代码在那里正常工作。 Scala代码:

DECLARE @T TABLE (
    [Date] DATE,
    [Value] DECIMAL(9,2)
)

INSERT @T VALUES
( '08-01-2016', 1 ),
( '08-02-2016', 1 ),
( '08-03-2016', 1 ),
( '08-04-2016', 1 ),
( '08-05-2016', 1 ),
( '08-06-2016', 2 ),
( '08-07-2016', 2 ),
( '08-08-2016', 2 ),
( '08-09-2016', 2.5 ),
( '08-10-2016', 1 ),
( '08-11-2016', 1 )

SELECT * FROM @T

SELECT A.[Date] StartDate, B.[Date] EndDate, A.[Value] FROM (
    SELECT A.*, ROW_NUMBER() OVER (ORDER BY A.[Date], A.[Value]) O FROM @T A
    LEFT JOIN @T B ON B.[Value] = A.[Value] AND B.[Date] = DATEADD(d, -1, A.[Date])
    WHERE B.[Date] IS NULL
) A
JOIN (
    SELECT A.*, ROW_NUMBER() OVER (ORDER BY A.[Date], A.[Value]) O FROM @T A
    LEFT JOIN @T B ON B.[Value] = A.[Value] AND B.[Date] = DATEADD(d, 1, A.[Date])
    WHERE B.[Date] IS NULL
) B ON B.O = A.O

flink程序: flink code 切断行读

scala> input = "hello"
input: String = hello
scala> val output = input.flatMap(value => value + ".")
output: String = h.e.l.l.o

我无法弄清楚我哪里出错了,我已经尝试过apache文档无济于事。你能给我的任何帮助都会受到好评。

3 个答案:

答案 0 :(得分:0)

首先,我建议学习一些关于函数编程和map / flatMap / reduce等操作的基础知识。

所有这些提到的功能都适用于集合。在您的scala示例中,@pedrofuria指出您将flatMap函数应用于String,这是char s的集合

在flink示例中,messageStream可以被抽象为字符串的集合,所以要执行你所描述的操作,你应该这样做:

val stream = messageStream.map(str => str.mkString("."))

我在你的例子中使用了mkString代替flatMap因为前者而不是

  

h.e.l.l.o(如你所写)

它产生

  

h.e.l.l.o。

但是,再一次真正从函数式编程的基础开始。

答案 1 :(得分:0)

感谢您的帮助,我想出了问题。 虽然flatMap函数在scala提示符下工作,但它在Flink中不起作用,因为Flink要求FlatMap传递带有覆盖的新FlatMapFunction。仍然不确定为什么它在flink中的scala提示符下工作,但代码现在编译并按预期运行。

答案 2 :(得分:0)

因为scala提示符中的flatMap与flink程序中的flatMap不同。

scala提示符中的

flatMap只是scala中的一个函数。

flink flatMap可以应用,输入如下:

val input = benv.fromElements(
            "To be, or not to be,--that is the question:--",
            "Whether 'tis nobler in the mind to suffer",
            "The slings and arrows of outrageous fortune",
            "Or to take arms against a sea of troubles,")
val counts = input
            .flatMap { _.toLowerCase.split("\\W+") }
            .map { (_, 1) }.groupBy(0).sum(1)

请参阅:scala-shell