pyspark dataframe map函数返回类型?

时间:2018-02-21 19:35:29

标签: apache-spark pyspark

pyspark 2.2 作为练习理解如何使用我自己的python函数使用map的练习,我创建了这个人为的要求。获取所有数据库,并使用map为每个数据库运行show tables并收集到所有数据库和表的数据框中。我知道有一个SparkSession.catalog方法可以帮助解决这个问题,但我想更多地了解如何使用map。

# create a function to return a dataframe of tables for each database
def get_tables(database_nm):
  '''get rows of tables in a database and return dataframe of
    database:string
    tableName:string
    isTemporary:boolean
  '''
  return spark.sql("show tables in {0}".format(database_nm))

 dbs_df = spark.sql("show databases")

dbs_df.select('databaseName').rdd.flatMap(lambda x:(get_tables(x))).take(5)

我的猜测是从我的函数返回一个数据帧是不正确的。如果是这样,我可以返回什么类型?

1 个答案:

答案 0 :(得分:0)

运行spark.sql("show tables in {0}".format(database_nm))时,您有效地指示spark解析并在其自己的SQL实现中将字符串作为SQL语句执行。这适用于您在Spark中创建的数据框创建的临时表。

此外,"show tables in {0}".format(database_nm)"是您自己的RDBMS供应商可能支持的一种管理命令或非标准SQL。这不会在火花中发挥作用。

根据the documentation,您可以创建一个从SQL数据源加载数据的数据框(使用jdbc):

jdbcDF = spark.read \
  .format("jdbc") \
  .option("url", "jdbc:postgresql:dbserver") \
  .option("dbtable", "schema.tablename") \
  .option("user", "username") \
  .option("password", "password") \
  .load()

您需要了解如何将数据库连接属性传递给Spark,并且就此而言,您需要从表/视图中加载信息。

如果您的RDBMS公开了元数据的视图(例如Oracle的数据字典),您应该能够使用以下内容检索表列表:

jdbcDF = spark.read \
  .format("jdbc") \
  .option("url", "jdbc:oracle:thin:@//dbserver:PORT/databasename") \
  .option("dbtable", "sys.ALL_TABLES") \
  .option("user", "username") \
  .option("password", "password") \
  .load()

这是一个可以收集并进一步生成动态数据帧的数据集。