Я продолжаю увеличивать целую последовательность для каждого домена в базе данных и использовать Hashids для кодирования целого числа в URL-адрес.
static hashids = Hashids(salt = "my app rocks", minSize = 6)
Я запустил скрипт, чтобы посмотреть, сколько времени потребуется, пока он не исчерпает длину символа. Для 6 символов он может использовать 164,916,224
ссылки, а затем до 7 символов. Бит использует 7 символов. Менее 5 символов выглядит странно для меня.
Hashids может декодировать путь URL обратно к целому числу, но более простым решением является использование всей короткой ссылки sho.rt/ka8ds3
в качестве первичного ключа.
Вот полная концепция:
function addDomain(domain) {
table("domains").insert("domain", domain, "seq", 0)
}
function addURL(domain, longURL) {
seq = table("domains").where("domain = ?", domain).increment("seq")
shortURL = domain + "/" + hashids.encode(seq)
table("links").insert("short", shortURL, "long", longURL)
return shortURL
}
// GET /:hashcode
function handleRequest(req, res) {
shortURL = req.host + "/" + req.param("hashcode")
longURL = table("links").where("short = ?", shortURL).get("long")
res.redirect(301, longURL)
}
Вам нужно использовать agg. Пример:
from pyspark import SparkContext
from pyspark.sql import HiveContext
from pyspark.sql import functions as F
sc = SparkContext("local")
sqlContext = HiveContext(sc)
df = sqlContext.createDataFrame([
("a", None, None),
("a", "code1", None),
("a", "code2", "name2"),
], ["id", "code", "name"])
df.show()
+---+-----+-----+
| id| code| name|
+---+-----+-----+
| a| null| null|
| a|code1| null|
| a|code2|name2|
+---+-----+-----+
Обратите внимание, что в приведенном выше вы должны создать HiveContext. См. https://stackoverflow.com/a/35529093/690430 для работы с различными версиями Spark.
(df
.groupby("id")
.agg(F.collect_set("code"),
F.collect_list("name"))
.show())
+---+-----------------+------------------+
| id|collect_set(code)|collect_list(name)|
+---+-----------------+------------------+
| a| [code1, code2]| [name2]|
+---+-----------------+------------------+