Итак, сначала я должен был внести эту коррекцию в ваш RDD (который соответствует вашему фактическому выходу):
rdd = sc.parallelize([('X01',41,'US',3),
('X01',41,'UK',1),
('X01',41,'CA',2),
('X02',72,'US',4),
('X02',72,'UK',6),
('X02',72,'CA',7),
('X02',72,'XX',8)])
Как только я сделал эту коррекцию, это сделало трюк:
df.select($"ID", $"Age").groupBy($"ID").agg($"ID", first($"Age") as "Age")
.join(
df.select($"ID" as "usID", $"Country" as "C1",$"Score" as "US"),
$"ID" === $"usID" and $"C1" === "US"
)
.join(
df.select($"ID" as "ukID", $"Country" as "C2",$"Score" as "UK"),
$"ID" === $"ukID" and $"C2" === "UK"
)
.join(
df.select($"ID" as "caID", $"Country" as "C3",$"Score" as "CA"),
$"ID" === $"caID" and $"C3" === "CA"
)
.select($"ID",$"Age",$"US",$"UK",$"CA")
Не так элегантно, как ваш стержень, конечно.
Не знайте, существует ли более эффективный способ сделать это, но это, кажется, работает на меня:
IPAddress[] host;
IPAddress[] local;
bool isLocal = false;
host = Dns.GetHostAddresses(uri.Host);
local = Dns.GetHostAddresses(Dns.GetHostName());
foreach (IPAddress hostAddress in host)
{
if (IPAddress.IsLoopback(hostAddress))
{
isLocal = true;
break;
}
else
{
foreach (IPAddress localAddress in local)
{
if (hostAddress.Equals(localAddress))
{
isLocal = true;
break;
}
}
if (isLocal)
{
break;
}
}
}
Я не знаю об отдельном методе проверить это. Однако можно сравнить свойство Uri's Host
или с локальным именем хоста или с IP-адресом.
можно получить локальное использование названия машины:
string hostName = System.Net.Dns.GetHostName()
можно затем получить массив IP-адресов путем передачи той строки:
System.Net.IPAddress[] addresses = System.Net.Dns.GetHostAddresses(hostName);
Включают свойство Uri's HostNameType
, вероятно UriHostNameType.Dns
или UriHostNameType.IPv4
, для соответствия или имени или IP-адресу.