用火花处理“相关”线

时间:2019-06-13 16:42:27

标签: scala apache-spark

假设一个目录中有多个文件,每个文件都是

File1

20100101|12.34|...
20100101|12.34|...
20100101|36.00|...
20100102|36.00|...
20100101|14.00|...
20100101|14.00|...

File2

20100101|12.34|...
20100101|12.34|...
20100101|36.00|...
20100102|36.00|...
20100101|14.00|...
20100101|14.00|...

具有相同日期和值的相邻行对应于同一事件。 两个单独文件中的两行不能相邻。

预期结果:

e1|20100101|12.34|...
e1|20100101|12.34|...
e2|20100101|36.00|...
e3|20100102|36.00|...
e4|20100101|14.00|...
e4|20100101|14.00|...
e5|20100101|12.34|...
e5|20100101|12.34|...
e6|20100101|36.00|...
e7|20100102|36.00|...
e8|20100101|14.00|...
e8|20100101|14.00|...

这里的eN是一个任意值(e1 <> e2 <> e3 ...),以澄清样本。

以下代码是否为所有文件的所有行提供了唯一的事件ID:

case class Event(
    LineNumber: Long, var EventId: Long,
    Date: String, Value: String //,..
)
val lines = sc.textFile("theDirectory")

val rows = lines.filter(l => !l.startsWith("someString")).zipWithUniqueId
    .map(l => l._2.toString +: l._1.split("""\|""", -1));
var lastValue: Float = 0;
var lastDate: String = "00010101";
var eventId: Long = 0;
var rowDF = rows
    .map(c => { 
        var e = Event(
            c(0).toLong, 0, c(1), c(2) //,...
        );
        if ( e.Date != lastDate || e.Value != lastValue) {
            lastDate = e.Date
            lastValue = e.Value
            eventId = e.LineNumber
        }
        e.EventId = eventId
        e   
    }).toDF();

基本上,我使用zipWithUniqueId给出的唯一行号作为一系列相邻行的键。

我认为我的基本问题是:第二个map操作是否有可能跨多个进程拆分文件的内容?

1 个答案:

答案 0 :(得分:1)

这是一个惯用的解决方案。希望这可以帮助。我使用文件名来区分文件。一个由文件名,zipindex组成的groupBy,然后再联接回原始输入数据帧,则可以得到所需的输出。

ulimit -c                                # 0=disabled
ulimit -c unlimited                      # enable core dumping
cat /proc/sys/fs/suid_dumpable           # 0=disabled, 1=???, 2=???
sysctl -w fs.suid_dumpable=2             # to enable dumping of setuid root process
cat /proc/sys/kernel/core_pattern        # to check how core dump is handled
echo core>/proc/sys/kernel/core_pattern  # to stop apport intercepting dump