【问题标题】:How to access an array using foreach in spark?如何在火花中使用 foreach 访问数组?
【发布时间】: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;

有人可以推荐吗?

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案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,非常感谢您提供的代码。我被困在这样做了。我以另一种方式做到了。无论如何感谢您的时间。
    • 它可能有助于其他人分享您所做的事情和/或接受对您有帮助的回答。
    • 你的回答真的很有帮助!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2019-04-30
    • 1970-01-01
    • 2018-08-09
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多