3
votes

Un moyen plus pratique de reproduire l'échantillon pyspark

La plupart des questions sur spark sont utilisées show comme exemple de code sans le code qui génère le dataframe, comme ceci:

df.show()
+-------+--------+----------+
|USER_ID|location| timestamp|
+-------+--------+----------+
|      1|    1001|1265397099|
|      1|    6022|1275846679|
|      1|    1041|1265368299|
+-------+--------+----------+

Comment puis-je reproduire ce code dans mon environnement de programmation sans le réécrire manuellement? pyspark a un équivalent de read_clipboard dans les pandas?


Edit

L'absence de fonction pour importer des données dans mon environnement est un gros obstacle pour moi pour aider les autres avec pyspark dans Stackoverflow.

Donc, ma question est:

Quel est le moyen le plus pratique de reproduire des données collées dans stackoverflow à partir de afficher la commande dans mon environnement?


6 commentaires

Est-ce ce que vous voulez convertir panda en dataframe? stackoverflow.com/questions/37513355 /…


@howie Cela peut faire partie de la réponse si quelqu'un répond d'abord comment convertir mon exemple de code pyspark en pandas.


Que voulez-vous dire convertir mon exemple de code pyspark en pandas? Vous ne savez pas comment créer le dataframe de panda?


@howie the ideia explique comment reproduire des exemples de données pyspark à partir d'autres questions. Si vous devez importer mes exemples de données pour m'aider, que feriez-vous?


Je vais créer manuellement un dataframe pyspark à partir de vos exemples de données ~ :)


Je pense que vous avez besoin d'un analyseur de table de texte ASCII?


4 Réponses :


1
votes

Vous pouvez toujours lire les données des pandas en tant que dataframe pandas, puis les reconvertir en dataframe spark. Non, il n'y a pas d'équivalent direct de read_clipboard dans pyspark contrairement aux pandas.

La raison en est que les dataframes Pandas sont pour la plupart des structures plates où, comme les dataframes spark peuvent avoir des structures complexes comme des struct, des tableaux, etc., puisqu'elles ont une grande variété de types de données et que ceux-ci n'apparaissent pas sur la sortie de la console, ce n'est pas possible pour recréer la trame de données à partir de la sortie.


1 commentaires

il est possible de lire mon exemple de code dans les pandas? pouvez-vous me montrer comment?



0
votes

Vous pouvez combiner panda read_clipboard et convertir en pyspark dataframe

def parse(ascii_table):
    header = []
    data = []
    for line in filter(None, ascii_table.split('\n')):
        if '-+-' in line:
            continue
        if not header:
            header = filter(lambda x: x!='|', line.split())
            continue
        data.append(['']*len(header))
        splitted_line = filter(lambda x: x!='|', line.split())
        for i in range(len(splitted_line)):
            data[-1][i]=splitted_line[i]
    return header, data

Mise à jour:

Ce que @terry veut vraiment, c'est copier du code ASCII table en python, et ce qui suit est exemple. Lorsque vous analysez des données en python, vous pouvez les convertir en n'importe quoi.

from pyspark.sql.types import *

pdDF = pd.read_clipboard(sep=',', 
                       index_col=0, 
                       names=['USER_ID', 
                              'location',
                              'timestamp',
                              ])



mySchema = StructType([ StructField("USER_ID", StringType(), True)\
                       ,StructField("location", LongType(), True)\
                       ,StructField("timestamp", LongType(), True)])

#note: True (implies nullable allowed)


df = spark.createDataFrame(pdDF,schema=mySchema)


1 commentaires

Que doit être ascii_table ?



2
votes

Vous pouvez toujours utiliser la fonction suivante:

from pyspark.sql.functions import *

def read_spark_output(file_path):
    step1 = spark.read \
             .option("header","true") \
             .option("inferSchema","true") \
             .option("delimiter","|") \
             .option("parserLib","UNIVOCITY") \
             .option("ignoreLeadingWhiteSpace","true") \
             .option("ignoreTrailingWhiteSpace","true") \
             .option("comment","+") \
             .csv("file://{}".format(file_path))
    # select not-null columns
    step2 = t.select([c for c in t.columns if not c.startswith("_")])
    # deal with 'null' string in column
    return step2.select(*[when(~col(col_name).eqNullSafe("null"), col(col_name)).alias(col_name) for col_name in step2.columns])

C'est l'une des suggestions données dans la question suivante: Comment créer de bons exemples Apache Spark reproductibles .

Remarque 1: Parfois, il peut y avoir des cas particuliers où cela peut ne pas s'appliquer pour une raison ou une autre et qui peut générer des erreurs / problèmes, c'est-à-dire Regrouper par colonne" grp "et compresser DataFrame - (prendre le dernier non nul valeur pour chaque colonne triée par colonne "ord") . Veuillez donc l'utiliser avec prudence!

Note 2: (Clause de non-responsabilité) Je ne suis pas l'auteur original du code. Merci à @MaxU pour le code. Je viens d'y apporter quelques modifications.


1 commentaires

Qu'est-ce que file_path ici?



2
votes

Réponse tardive, mais je suis souvent confronté au même problème, alors j'ai écrit un petit utilitaire pour ce https: // github.com/ollik1/spark-clipboard

Il permet essentiellement de copier-coller des chaînes de show frame de données pour déclencher. Pour l'installer, ajoutez la dépendance jcenter com.github.ollik1: spark-clipboard_2.12: 0.1 et spark config .config ("fs.clipboard.impl", "com.github.ollik1 .clipboard.ClipboardFileSystem ") Après cela, les blocs de données peuvent être lus directement à partir du presse-papiers du système

val df = spark.read
  .format("com.github.ollik1.clipboard")
  .load("clipboard:///*")

ou des fichiers si vous préférez. Les détails de l'installation et l'utilisation sont décrits dans le fichier Lisez-moi.


1 commentaires

C'est avancé! :)