将Spark数据框中的列拆分为新行[Scala]

时间:2016-11-11 13:52:48

标签: scala apache-spark spark-dataframe

我有一个火花数据框的输出,如下所示:

Amt | id | num | Start_date |标识符
43.45 | 19840 | A345 | [2014-12-26,2013-12-12] | [232323,45466] |
43.45 | 19840 | A345 | [2010-03-16,2013-16-12] | [34343,45454] |

我的要求是从上面的输出

生成以下格式的输出

Amt | id | num | Start_date |标识符
43.45 | 19840 | A345 | 2014-12-26 | 232323个
43.45 | 19840 | A345 | 2013年12月12日| 45466个
43.45 | 19840 | A345 | 2010-03-16 | 34343个
43.45 | 19840 | A345 | 2013-16-12 | 45454

有人可以帮助我实现这一目标。

3 个答案:

答案 0 :(得分:1)

这是你正在寻找的东西吗?

.navbar.fixed{
  background: rgba(255,255,255,0.6);
}

返回:

<?php
$conn =  mysqli_connect('server', 'username', 'password', 'database') or die ("Couldnt connect to database");
$sql = "SELECT * from table_name";
$query = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($query);
if (mysqli_num_rows($query)==0)
  {
  echo '<tr><td align=center colspan=7>No Rows Returned</td>/tr>';
  }
else
  {
  while( $row = mysqli_fetch_assoc($query))
    {
    echo "<tr valign=top><td>{$row['id']}</td><td>{$row['usergroup']}</td><td>{$row['Firstname']}</td><td>{$row['Surname']}</td><td>{$row['Email']}</td><td>{$row['Address']}</td><td>{$row['Postcode']}</td></tr>\n";
    }
  }
?>

编辑:

由于您希望有多列应该压缩,您应该尝试这样的事情:

import org.apache.spark.sql._
import org.apache.spark.sql.functions._

val sparkSession = ...
import sparkSession.implicits._

val input = sc.parallelize(Seq(
  (43.45, 19840, "A345", Seq("2014-12-26", "2013-12-12"), Seq(232323,45466)),
  (43.45, 19840, "A345", Seq("2010-03-16", "2013-16-12"), Seq(34343,45454))
)).toDF("amt", "id", "num", "start_date", "identifier")

val zipArrays = udf { (dates: Seq[String], identifiers: Seq[Int]) =>
  dates.zip(identifiers)
}

val output = input.select($"amt", $"id", $"num", explode(zipArrays($"start_date", $"identifier")))
  .select($"amt", $"id", $"num", $"col._1".as("start_date"), $"col._2".as("identifier"))

output.show()

答案 1 :(得分:0)

如果我理解正确,你需要col 3和4的第一个元素。 这有意义吗?

val newDataFrame = for {
    row <- oldDataFrame
} yield {
  val zro = row(0) // 43.45
  val one = row(1) // 19840
  val two = row(2) // A345
  val dates = row(3) // [2014-12-26, 2013-12-12]
  val numbers = row(4) // [232323,45466]
  Row(zro, one, two, dates(0), numbers(0))
}

答案 2 :(得分:0)

你可以使用SparkSQL。

  • 首先,您要创建一个包含我们需要处理的信息的视图:

    df.createOrReplaceTempView("tableTest")

  • 然后您可以选择包含扩展的数据:

    sparkSession.sqlContext.sql(
        "SELECT Amt, id, num, expanded_start_date, expanded_id " +
        "FROM tableTest " +
        "LATERAL VIEW explode(Start_date) Start_date AS expanded_start_date " +
        "LATERAL VIEW explode(Identifier) AS expanded_id")
    .show()