【问题标题】:Convert List into dataframe spark scala将列表转换为数据框 spark scala
【发布时间】:2017-06-11 13:14:18
【问题描述】:

我有一个包含 30 多个字符串的列表。如何将列表转换为数据框。 我尝试了什么:

例如

Val list=List("a","b","v","b").toDS().toDF()

Output :


+-------+
|  value|
+-------+
|a      |
|b      |
|v      |
|b      |
+-------+


Expected Output is 


  +---+---+---+---+
| _1| _2| _3| _4|
+---+---+---+---+
|  a|  b|  v|  a|
+---+---+---+---+

对此有任何帮助。

【问题讨论】:

  • 你正在读取的列表是文件还是表格?
  • 您可以尝试将列表映射到元组列表,其中 _1 表示位置。不过,我忘记了如何获得列表位置。
  • 否。我正在从 xml 文件中读取标签值。它有 30 多个字段。XML 文件不是结构格式,因此我无法使用 databrick API 将 XML 转换为 DF。

标签: scala apache-spark apache-spark-sql spark-dataframe


【解决方案1】:

List("a","b","c","d") 表示具有一个字段的记录,因此结果集每行显示一个元素。

要获得预期的输出,该行中应该有四个字段/元素。因此,我们将列表包装为List(("a","b","c","d")),它代表一行,有四个字段。 以类似的方式,包含两行的列表为 List(("a1","b1","c1","d1"),("a2","b2","c2","d2"))

scala> val list = sc.parallelize(List(("a", "b", "c", "d"))).toDF()
list: org.apache.spark.sql.DataFrame = [_1: string, _2: string, _3: string, _4: string]

scala> list.show
+---+---+---+---+
| _1| _2| _3| _4|
+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+


scala> val list = sc.parallelize(List(("a1","b1","c1","d1"),("a2","b2","c2","d2"))).toDF
list: org.apache.spark.sql.DataFrame = [_1: string, _2: string, _3: string, _4: string]

scala> list.show
+---+---+---+---+
| _1| _2| _3| _4|
+---+---+---+---+
| a1| b1| c1| d1|
| a2| b2| c2| d2|
+---+---+---+---+

【讨论】:

  • 我如何声明这个列表(("a1","b1","c1","d1"),("a2","b2","c2","d2") )。它是一个列表[List[String]] 吗?我需要从表查询输出的循环中动态获取它。
【解决方案2】:

为了使用 toDF,我们必须导入

import spark.sqlContext.implicits._

请参考以下代码

val spark = SparkSession.
builder.master("local[*]")
  .appName("Simple Application")
.getOrCreate()

import spark.sqlContext.implicits._

val lstData = List(List("vks",30),List("harry",30))
val mapLst = lstData.map{case List(a:String,b:Int) => (a,b)}
val lstToDf = spark.sparkContext.parallelize(mapLst).toDF("name","age")
lstToDf.show

val llist = Seq(("bob", "2015-01-13", 4), ("alice", "2015-04- 23",10)).toDF("name","date","duration")
llist.show

【讨论】:

  • 我在使用 toDF 时遇到问题,我发现调用 parallelize 的结果是 RDD[T] 没有 toDF 方法
  • 你可能忘记了这个:import spark.sqlContext.implicits._
  • 我可以在 spark 2.x 中直接使用 mapLst.toDF("name","age") 而不是使用并行化将列表转换为 RDD 然后执行 toDF 吗?我相信 toDF 会直接处理数据集的并行化。
【解决方案3】:

这样就可以了:

val data = List(("Value1", "Cvalue1", 123, 2254, 22),("Value1", "Cvalue2", 124, 2255, 23));
val df = spark.sparkContext.parallelize(data).toDF("Col1", "Col2", "Expend1", "Expend2","Expend3");
val cols=Array("Expend1","Expend2","Expend3");
val df1=df
        .withColumn("keys",lit(cols))
        .withColumn("values",array($"Expend1",$"Expend2",$"Expend3"))
        .select($"col1",$"col2",explode_outer(map_from_arrays($"keys", $"values")))
        .show(false)

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 2021-06-09
    • 2019-09-13
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多