Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在spark中将任意长度的数组[String]转换为一行数据帧_Scala_Apache Spark - Fatal编程技术网

Scala 如何在spark中将任意长度的数组[String]转换为一行数据帧

Scala 如何在spark中将任意长度的数组[String]转换为一行数据帧,scala,apache-spark,Scala,Apache Spark,我有一个任意长度的数组[String],如: val strs = Array[String]("id","value","group","ts") 如何将其传输到DataFrame,如下所示: +-----+------+-------+----+ |_0 | _1 | _2 | _3 | +-----+------+-------+----+ | id| value| group | ts | 我尝试的解决方案是: 代码: 或 结果: +----------------

我有一个任意长度的数组[String],如:

val strs = Array[String]("id","value","group","ts")
如何将其传输到DataFrame,如下所示:

+-----+------+-------+----+
|_0   | _1   | _2    | _3 |
+-----+------+-------+----+
|   id| value| group | ts |
我尝试的解决方案是:

代码:

结果:

+--------------------+
|               value|
+--------------------+
|[id, value, group...|
+--------------------+
+-----+
|value|
+-----+
|   id|
|value|
|group|
|   ts|
+-----+
代码:

结果:

+--------------------+
|               value|
+--------------------+
|[id, value, group...|
+--------------------+
+-----+
|value|
+-----+
|   id|
|value|
|group|
|   ts|
+-----+
不是我想要的

我知道解决方案如下:

 val data1 = List(
      (1,"A","X",1),
      (2,"B","X",2),
      (3,"C",null,3),
      (3,"D","C",3),
      (4,"E","D",3)
    ).toDF("id","value","group","ts").show()
但是在我的例子中,数组[String]是任意长度的

val strs = Array[String]("id","value","group","ts")
val list_of_strs  = List[Array[String]]() :+ strs
spark.sparkContext.parallelize(list_of_strs)
  .map { case Array(s1,s2,s3,s4) => (s1,s2,s3,s3) }
  .toDF().show()
问题显然是创建一个包含单个元素的列表,而该元素也是一个集合。我想解决办法是先创建一个空列表,然后添加单个元素

与更新一样,问题似乎在于我们没有处理元组,这也可能有效:

val strs = Array[String]("id","value","group","ts")
spark.sparkContext.parallelize(List(strs))
  .map { case Array(s1,s2,s3,s4) => (s1,s2,s3,s3) }
  .toDF().show()

但我不认为我们可以处理任意长度的数组,因为这将导致任意长度的元组。。。这是没有意义的,因为对于数据帧,我们还处理固定定义的行(列数和列类型)。如果真的发生了这种情况,您将不得不用空格填充剩余的元组项,并使用最大的元组。

有大量资源可供谷歌搜索。我尝试了答案,但可能与@shaido的答案重复。问题是海报以数组[String]的变量开头,并且不希望重写以直接嵌入序列作为
.parallelize(列表(“a”、“b”、“c”))
。这将构成硬编码。。。至少我想这就是我的意图。Henced引用的帖子也不会回答。@YoYo是的,你是对的,
列表(“a”、“b”、“c”)
在这里不起作用,因为数组或列表是任意长度的,我们不知道长度和值。您的代码得到的结果与:
+--------------+\value+-----------+|[id、值、组…|+-----------+
进行了更新,试图首先将数组映射到元组。
val strs = Array[String]("id","value","group","ts")
spark.sparkContext.parallelize(List(strs))
  .map { case Array(s1,s2,s3,s4) => (s1,s2,s3,s3) }
  .toDF().show()