PySpark получает вложенный массив из sql Dataframe [duplicate]

Я продолжаю увеличивать целую последовательность для каждого домена в базе данных и использовать 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)
}

25
задан Hanan Shteingart 2 June 2016 в 00:17
поделиться

1 ответ

Вам нужно использовать 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]|
+---+-----------------+------------------+
37
ответ дан pault 18 August 2018 в 23:27
поделиться
  • 1
    collect_set () содержит отдельные элементы, а collect_list () содержит все элементы (кроме нулей) – gps 3 May 2018 в 11:06
  • 2
    размер функции на collect_set или collect_list будет лучше вычислять значение счета или использовать функцию простого подсчета. Я использую окно, чтобы получить счет транзакции, привязанный к учетной записи. – user3858193 6 May 2018 в 15:14