Onde você precisa usar lit () em Pyspark SQL?

estou a tentar perceber onde é que precisas de usar um valor lit, que é definido como a literal column na documentação.

Tome por exemplo este udf, que devolve o índice de uma lista de colunas SQL:

def find_index(column, index):
    return column[index]
Se eu passasse um número inteiro nisto, teria um erro. Eu precisaria passar um valor lit(n) para a udf para obter o índice correto de um array.

existe um lugar onde eu possa aprender melhor as regras duras e rápidas de quando usar lit e possivelmente col como então?

Author: flybonzai, 2016-06-09

1 answers

Para o manter simples, você precisa de um Column (pode ser um criado usando lit mas não é a única opção) quando o homólogo do JVM espera uma coluna e não há conversão interna numa capa de Python ou deseja chamar um método específico Column.

No primeiro caso, a única regra estrita é a que se aplica às UDFs. UDF (Python ou JVM) pode ser chamado apenas com argumentos que são do tipo Column. Também se aplica tipicamente a funções de pyspark.sql.functions. Noutros casos, é sempre o melhor para verificar a documentação e os documentos strings firsts e se não for suficiente docs de uma contraparte Scala correspondente. No segundo caso, as regras são simples. Se, por exemplo, quiser comparar uma coluna com um valor, então o valor tem de estar no RHS:
col("foo") > 0  # OK

Ou o valor tem de ser embrulhado com literal:

lit(0) < col("foo")  # OK

Pode usar um objecto não-coluna no LHS:

0 < col("foo") 
Mas isto só se aplica ao Python e não vai funcionar no Scala. Isto aplica-se, naturalmente, a outros operadores (==,
 10
Author: zero323, 2017-02-13 19:59:19