第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法在 UDF 中添加新列(在 java spark 中)

有沒有辦法在 UDF 中添加新列(在 java spark 中)

繁星淼淼 2023-05-24 14:59:59
我有一個 spark 數(shù)據(jù)集的列(在 java 中),我希望該列的所有值成為新列的列名(新列可以用常量值填充)。For example I have:+------------+|    Column  | +------------+| a          | | b          || c          |+------------+And I want: +------+----+----+---+|Column| a  |  b | c |+------+----+----+---+| a    | 0  | 0  |0  || b    | 0  | 0  |0  || c    | 0  | 0  |0  |+------+----+----+---+我試過的是:public class test{    static SparkSession spark = SparkSession.builder().appName("Java")            .config("spark.master", "local").getOrCreate();    static Dataset<Row> dataset = spark.emptyDataFrame();    public Dataset<Row> test(Dataset<Row> ds, SparkSession spark) {        SQLContext sqlContext = new SQLContext(spark);        sqlContext.udf().register("add", add, DataTypes.createArrayType(DataTypes.StringType));        ds = ds.withColumn("substrings", functions.callUDF("add", ds.col("Column")));        return ds;    }    private static UDF1 addSubstrings = new UDF1<String, String[]>() {        public String[] call(String str) throws Exception {            dataset = dataset.withColumn(str, functions.lit(0));            String[] a = {"placeholder"};            return a;        }    };}我的問題是,有時我得到正確的結果,有時卻沒有(未添加列)。我真的不明白為什么。我正在尋找一種將數(shù)據(jù)集傳遞給 UDF 的方法,但我不知道該怎么做。目前我正在通過使用列的 collectAsList() 來解決它,然后迭代 Arraylist 從而添加新列。但這真的很低效,因為我的數(shù)據(jù)太多了。
查看完整描述

3 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

對于這個用例,您可以使用pivot

ds

?.withColumn("pivot_column", $"first_column")

?.groupBy($"first_column")

?.pivot("pivot_column")

?.count

如果你想要更好的性能,你可能想在 pivot 中提供可能的值,比如pivot("pivot_column", Seq("a", "b", "c"))


我用于count聚合,但你可以進行任何你想要的聚合。


From

+------------+

|first_column|?

+------------+

| a? ? ? ? ? |?

| b? ? ? ? ? |

| c? ? ? ? ? |

+------------+


To


+------------+---+---+---+

|first_column| a | b | c |

+------------+---+---+---+

| a? ? ? ? ? | 1 | 0 | 0 |

| b? ? ? ? ? | 0 | 1 | 0 |

| c? ? ? ? ? | 0 | 0 | 1 |

+------------+---+---+---+


查看完整回答
反對 回復 2023-05-24
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

如果的值Column是最小的/更少,請嘗試下面的代碼。


df.show

+------+

|Column|

+------+

|     A|

|     B|

|     C|

+------+


// If you have multiple columns are exist, select only required column

val names = df.select($"Column").as[String].collect 

val df1 = names.foldLeft(df)((df,n) => df.withColumn(n, lit(0)))

df1.show()

+------+---+---+---+

|Column|  A|  B|  C|

+------+---+---+---+

|     A|  0|  0|  0|

|     B|  0|  0|  0|

|     C|  0|  0|  0|

+------+---+---+---+


查看完整回答
反對 回復 2023-05-24
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

我認為 Spark 的本質(更準確地說,它的并行性)不允許您使用 UDF 實現(xiàn)您的目標。

執(zhí)行查詢時,Spark 將數(shù)據(jù)分發(fā)給執(zhí)行器,每個執(zhí)行器都有自己的行塊。每個行塊都有自己的列的可能值列表Column。因此,每個執(zhí)行者都會嘗試添加自己的列列表,這與其他執(zhí)行者所做的不同。因此,當驅動程序嘗試合并來自不同執(zhí)行程序的結果集時,它會失?。ɑ蛘邎?zhí)行程序可能會失敗)。

collectAsList確實解決了你的問題,雖然效率很低。

此外,您可以猜測列數(shù)并發(fā)明一些函數(shù)(適合您的實際數(shù)據(jù))來將列獲得的值映射Column到這些數(shù)字 - 這樣您就可以使每個執(zhí)行程序的列集保持相等。該解決方案不是很通用,但可以解決某些情況。即,您會得到像這樣的列:<c01, c02, c03, ..., cNN>


查看完整回答
反對 回復 2023-05-24
  • 3 回答
  • 0 關注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號