如何在火花中使用 foreach 访问数组?

Posted

技术标签:

【中文标题】如何在火花中使用 foreach 访问数组?【英文标题】:How to access an array using foreach in spark? 【发布时间】:2018-09-17 17:02:53 【问题描述】:

我有如下数据:

tab1,c1|c2|c3
tab2,d1|d2|d3|d4|d5
tab3,e1|e2|e3|e4

我需要在spark中将其转换为如下:

select c1,c2,c3 from tab1;
select d1,d2,d3,d4,d5 from tab2;
select e1,e2,e3,e4 from tab3;

我可以这样:

d.foreach(f=>println("select"+" "+f+" from"+";"))
select tab3,e1,e2,e3,e4 from;
select tab1,c1,c2,c3 from;
select tab2,d1,d2,d3,d4,d5 from;

有人可以推荐吗?

【问题讨论】:

【参考方案1】:

我没有看到 spark 适合您的问题。变量“d”代表什么?

这是我对一些可能有用的猜测。

from pyspark.sql.types import *
from pyspark.sql.functions import *

mySchema = StructType([
  StructField("table_name", StringType()),
  StructField("column_name", 
    ArrayType(StringType())
  )
])

df = spark.createDataFrame([
                            ("tab1",["c1","c2","c3"]),
                            ("tab2",["d1","d2","d3","d4","d5"]),
                            ("tab3",["e1","e2","e3","e4"])
  ],
  schema = mySchema
)

df.selectExpr('concat("select ", concat_ws(",", column_name), " from ", table_name, ";") as select_string').show(3, False)

输出:

+--------------------------------+
|select_string                   |
+--------------------------------+
|select c1,c2,c3 from tab1;      |
|select d1,d2,d3,d4,d5 from tab2;|
|select e1,e2,e3,e4 from tab3;   |
+--------------------------------+

【讨论】:

这是选项之一。我实际上希望通过 RDD 创建。【参考方案2】:

您还可以在 RDD 上使用map 操作。

假设您的 RDD 为 String,例如:

val rdd = spark.parallelize(Seq(("tab1,c1|c2|c3"), ("tab2,d1|d2|d3|d4|d5"), ("tab3,e1|e2|e3|e4")))

通过这个操作:

val select = rdd.map(str=> 
      val separated = str.split(",", -1)
      val table = separated(0)
      val cols = separated(1).split("\\|", -1).mkString(",")

      "select " + cols + " from " + table + ";"
    )

你会得到预期的结果:

select.foreach(println(_))
select d1,d2,d3,d4,d5 from tab2;
select e1,e2,e3,e4 from tab3;
select c1,c2,c3 from tab1;

【讨论】:

嘿 pheeleeppoo,非常感谢您提供的代码。我被困在这样做了。我以另一种方式做到了。无论如何感谢您的时间。 它可能有助于其他人分享您所做的事情和/或接受对您有帮助的回答。 你的回答真的很有帮助!谢谢

以上是关于如何在火花中使用 foreach 访问数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问数组类型值并在两个不同的列中设置火花?

如何将火花数据帧数组转换为元组

如何在刀片模板的 foreach 循环中访问 laravel 集合?

如何从 foreach 循环中将双精度值附加到 2D 数组,并访问前一个索引?

如何在 foreach 循环中设置变量以在 PHP 中进行外部访问?

如何在火花中将列转换为数组[长]