假设一个目录中有多个文件,每个文件都是
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操作是否有可能跨多个进程拆分文件的内容?
答案 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