我一直在寻找一个很好的问题,以提高我的Scala技能和答案:Extract a column value and assign it to another column as an array in spark dataframe
我按如下所示创建了修改后的代码,但仍然存在一些问题:
name, age
它有效,但是:
df.withColumn(“ X”,myfun_udf(col(“ a”)))。show
所以,这是我在其他地方查看过的代码,但是我缺少一些东西。
答案 0 :(得分:1)
您显示的代码没有多大意义:
udf
不需要udf
)udf
空变量就足够了总体而言,这只是为OP提供服务的另一个令人费解和误导性的答案。我会忽略(或vote accordingly)并继续前进。
那怎么办呢?
如果您有本地列表,并且确实要使用udf
。对于单个序列,请结合使用nullary
和val uniqueBVal: Seq[Int] = ???
val addUniqueBValCol = udf(() => uniqueBVal)
df.withColumn("X", addUniqueBValCol())
函数:
import scala.reflect.runtime.universe.TypeTag
def addLiteral[T : TypeTag](xs: Seq[T]) = udf(() => xs)
val x = addLiteral[Int](uniqueBVal)
df.withColumn("X", x())
推广到:
udf
最好不要使用import org.apache.spark.sql.functions._
df.withColumn("x", array(uniquBVal map lit: _*))
:
import org.apache.spark.sql.expressions.Window
val w = Window.rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)
df.select($"*" +: df.columns.map(c => collect_set(c).over(w).alias(s"${c}_unique")): _*)
截至
正如开头提到的,整个概念很难辩护。两种窗口功能(完全无法扩展)又如何使它对所有列通用?
val uniqueValues = df.select(
df.columns map (c => collect_set(col(c)).alias(s"${c}_unique")):_*
)
df.crossJoin(uniqueValues)
或以聚合方式交叉连接(大多数情况下不可扩展)
DateTimeTimeZone start = new DateTimeTimeZone
{
TimeZone = TimeZoneInfo.Local.Id,
DateTime = dateTimePicker1.Value.ToString("o"),
};
DateTimeTimeZone end = new DateTimeTimeZone
{
TimeZone = TimeZoneInfo.Local.Id,
DateTime = dateTimePicker2.Value.ToString("o"),
};
Location location = new Location
{
DisplayName = "Thuis",
};
byte[] contentBytes = System.IO.File
.ReadAllBytes(@"C:\test\sample.pdf");
var ev = new Event();
FileAttachment fa = new FileAttachment
{
ODataType = "#microsoft.graph.fileAttachment",
ContentBytes = contentBytes,
ContentType = "application/pdf",
Name = "sample.pdf",
IsInline = false,
Size = contentBytes.Length
};
ev.Attachments = new EventAttachmentsCollectionPage();
ev.Attachments.Add(fa);
ev.Start = start;
ev.End = end;
ev.IsAllDay = false;
ev.Location = location;
ev.Subject = textBox2.Text;
var response = await graphServiceClient
.Users["user@docned.nl"]
.Calendar
.Events
.Request()
.AddAsync(ev);
尽管如此,通常-您必须重新考虑您的方法,如果这种方法可以应用于实际应用程序中,除非您确定不能知道列的基数很小并且具有严格的上限。
带走消息是-不要相信随机人在互联网上发布的随机代码。其中一个。