Leap Frame 操作

Leap Frame 提供了如下基本操作:

  1. 创建新列并插入数据
  2. 删除列
  3. 读取一行数据
  4. 选出多列数据并插入到一条新的 Leap Frame 当中

插入数据

从已有字段中生成新的值非常简单,只需要指定输出字段的名字,输入字段的列表,以及一个能够生成新的输出的 Scala 函数。

  1. // Insert some values into the leap frame
  2. val leapFrame2 = leapFrame.withOutput("generated_field", "a_string", "an_int") {
  3. (str: String, i: Int) => s"$str: $i"
  4. }
  5. // Extract our new data from the leap frame
  6. val generatedStrings: Seq[String] = (for(lf <- leapFrame2;
  7. lf2 <- lf.select("generated_field", "a_string", "an_int")) yield {
  8. val str = lf2.dataset(0).getString(1) // get value of "a_string"
  9. val i = lf2.dataset(0).getInt(2) // get value of "an_int"
  10. assert(lf2.dataset(0).getString(0) == s"$str: $i")
  11. lf2.dataset.map(_.getString(0))
  12. }).get.toSeq
  13. // Print out our generated strings
  14. // > "Hello, MLeap!: 42"
  15. // > "Another row: 43"
  16. println(generatedStrings.mkString("\n"))

插入可选值

MLeap 中的 Null 值通过 Scala 中的 Option 单子来实现。让我们输出一些可选的 Null 值到 Leap Frame 中。

  1. // Insert some values into the leap frame
  2. val leapFrame3 = leapFrame.withOutput("optional_int", "a_double", "an_int") {
  3. (d: Double, i: Int) =>
  4. if(i > 42) {
  5. Some(777)
  6. } else { None }
  7. }
  8. // Extract our new data from the leap frame
  9. val optionalInts: Seq[Option[Int]] = (for(lf <- leapFrame3;
  10. lf2 <- lf.select("optional_int")) yield {
  11. lf2.dataset.map(_.optionInt(0))
  12. }).get.toSeq
  13. // Print out our optional ints
  14. // > Some(777)
  15. // > None
  16. println(optionalInts.mkString("\n"))

删除字段

从 Leap Frame 中删除一个字段。

  1. assert(leapFrame.schema.hasField("a_double"))
  2. for(lf <- leapFrame.dropField("a_double")) {
  3. assert(!lf.schema.hasField("a_double"))
  4. }

读取数据

访问 Leap Frame 中的数据行。

  1. val data = leapFrame.dataset
  2. assert(data.head == Row("Hello, MLeap!", 56.7d, 13.0f, 42, 67l))
  3. assert(data(1) == Row("Another row", 23.4d, 11.0f, 43, 88l))
  4. // Datasets are iterable over their rows
  5. assert(data.toSeq.size == 2)

选取字段

通过选取已有字段,创建一帧新的 Leap Frame。

  1. assert(leapFrame.schema.hasField("a_double"))
  2. assert(leapFrame.schema.hasField("a_string"))
  3. assert(leapFrame.schema.hasField("an_int"))
  4. assert(leapFrame.schema.fields.size == 5)
  5. for(lf <- leapFrame.select("a_double", "a_string")) {
  6. assert(lf.schema.hasField("a_double"))
  7. assert(lf.schema.hasField("a_string"))
  8. assert(!lf.schema.hasField("an_int"))
  9. assert(lf.schema.fields.size == 2)
  10. }